재설정을 원격 저장소에 강제로 푸시하는 방법은 무엇입니까?


94

원격 마스터 브랜치가 엉망이되었습니다. 현재 개발 코드는 최신 커밋과 함께 마스터 브랜치에 있습니다. 분명히 개발 코드는 마스터 브랜치에 대해 준비되지 않았습니다.

그래서 내 로컬 저장소에서 최신 태그 인 git reset --hard (Tag). 이제 마스터 브랜치가 내 로컬 저장소에서 정확합니다. 이제 변경 사항을 원격 저장소에 푸시하려고 git push origin master하면 오류가 발생합니다.

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

그래서 주변을 둘러 본 후 --force옵션을 찾았습니다 . 그래서 원격 저장소에 강제 푸시를 git push --force origin master했지만 여전히 오류가 발생했습니다.

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

마스터에있을 수없는 개발 코드가 포함되어 있기 때문에 마스터에 끌어 올 수 없습니다.


3
이 메시지는 빨리 감기가 아닌 푸시를 할 권리가 없다는 것을 의미한다고 생각합니다.
svick

3
당신이 맞았어요, 감사합니다. 원격 저장소의 구성 파일에서 denyNonFastforwards = true. 나는 그것을 false로 변경하고 변경 사항을 푸시 한 다음 다시 true로 변경했습니다. 도움을 주신 모든 분들께 다시 한 번 감사드립니다.
samwell

2
@samwell하시기 바랍니다 인정 등의 표시 svick의 대답
hultqvist

@samwell svick의 답변이 당신을 위해 작동 했습니까?
Songo 2014 년

samwell이 한 것처럼 denyNonFastForwards를 비활성화하는 방법에 대한 자세한 내용이 필요한 사람들은 여기에서 자세한 지침을 찾을 수 있습니다. stackoverflow.com/a/43721579/2073804
ron190

답변:


152

이 메시지는 빨리 감기가 아닌 푸시를 할 수 없음을 의미합니다.

원격 저장소는 대부분 denyNonFastforwards = true구성에 있습니다. 그것을 변경 git push --force하면 작동합니다.

설정을 변경하려면 원격 저장소가있는 시스템에 액세스해야합니다. 거기에서 git config receive.denynonfastforwards false.


1
당신은 git config서버를 위해 할 수 있습니까 ? 또는 아마도 당신은 그것을 은유 적으로 사용하고 있었을 것입니다. 이 아이디어를 가지고 놀기 위해 /opt/git(내 git 서버 공간) 에 테스트 저장소를 만든 다음 /opt/git/the_repo/the_repo.git/config. 그러나 일단 필요에 따라 git push --force origin SHA:branch작업을 수행 했습니다.
HankCa

4
오류 메시지에는 "error : failed to push some refs to <your repository>"로 시작하는 행이 있습니다. 여기서 <your repository>는 "config"라는 파일이 포함 된 디렉토리 인 .git로 끝나는 경로입니다. 이 "설정"파일은 denyNonFastforwards = false를 설정할 수 있습니다
에머리

1
@emery의 의견은 소중합니다. 때때로 서버의 폴더는 /srv/git/repo.git과 같은 원본으로 설정됩니다. 이것은 응용 프로그램 폴더가 아니라 denyNonFastForwards가 설정된 구성입니다.
Elijah Lynn

1
@hsalimi 서버에 액세스 할 수없는 경우 서버 관리자에게 연락하여 일시적으로 끄도록하여 강제로 푸시 한 다음 다시 켤 수 있도록해야합니다. 하지만 대부분이이를 수행 할 수있는 위치에 있지는 않습니다. 자체 호스팅 팀이있는 내부 환경에서는 더 일반적 일 수 있습니다.
Elijah Lynn

1
이것은 처음에는 실망 스럽지만 그 장점은 기본적으로 원격이 완전히 보호된다는 것입니다. 개발자로서 의도적으로 올바르게 리베이스를 수행하는 경우 위험한 동작을 허용하도록이 구성을 재정의 할 수 있습니다. 리베이스는 모든 git 사용자가해야 할 일과하지 말아야 할 때를 알아야하는 것입니다. DOC1의 doc2
moodboom

15

리모컨은 빨리 감기를 허용하지 않습니다.

최선의 선택은 git revert거기에 있으면 안되고 앞으로 더 조심해야 할 모든 커밋입니다.

git revert [commit]무엇을 [commit]했는지 취소하는 새로운 커밋을 생성합니다 .


빨리 감기가 아닌 모든 변경 사항을 차단 한 것은 원격 저장소의 일부 설정이었습니다.
samwell

당신이하고 필요로 할 경우 다시 적용은 역사 바로 코드 변경 되돌리기에서 제거되지 않습니다 커밋, 당신은 커밋 또는 병합 선택 벚꽃 할 수 없습니다에
mtpultz

12

다음 스타일에서 강제 푸시를 영구적으로 활성화하는 단계

git push -f myrepo my-branch

원격 저장소에서 ".git"로 끝나는 폴더에서 "config"라는 파일을 편집합니다.

푸시에 실패한 git의 명령 줄 출력에서 ​​다음과 같은 줄을 찾습니다.

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

그때

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

"denyNonFastforwards"를 false로 설정

"config"에서

[receive]
        denyNonFastforwards = false

이제 -f를 사용하여 로컬 머신에서 푸시 할 수 있습니다.

git push -f myrepo my-branch

bare git repo에 SSH에 액세스하지 않고 어떻게 할 수 있습니까?
Vladimir Vukanac

richo가 제안한 것처럼 git revert 명령을 사용할 수 있습니까? 먼저 리포지토리의 현재 상태를 백업하는 경우 계속 진행하면서 코드를 병합 할 수 있습니다.
에머리

git revert병합 할 때 다소 복잡합니다. 더 복잡하게 말하면 내 경우에는 3 개의 병합이 있으며 그중 하나는 개발에서 분기 된 매우 오래된 ~ 20 개의 커밋이 있고 두 번째는 마스터에서 병합하는 것입니다.
Vladimir Vukanac

1
해결책은 원하는 상태로 재설정하고 백업 (숨김)하고 다시 가져 와서 백업 (숨김)을 적용하는 것입니다.
Vladimir Vukanac

1
mrW 되돌려 진 / 풀링 된 코드베이스 위에 원하는 코드베이스를 병합 할 수 있습니다
emery

11

-f플래그를 사용하고 원격 브랜치 이름 뒤에 두십시오.

git push origin master -f


1
아니, 그것도 작동하지 않았습니다. 나는 또한 git push -f origin master같은 결과를 시도했다 . 두 번 시도해 보았습니다. 두 번째 버전의 오류 메시지가 표시되었습니다.
samwell

2

빨리 감기가 아닌 git push를 할 수 없습니다.

  1. 원격이 GitHub 인 경우 해당 https://github.com/$USER/$REPO/settings/branches분기 로 이동하여 보호를 해제하십시오.

    여기에 이미지 설명 입력

    그렇게하려면 저장소의 관리자 여야합니다.

  2. 원격이 자신의 git 서버 인 경우 git config receive.denynonfastforwards false거기 에서 실행하십시오 .


Git Hub Enterprise 인스턴스의 경우 기본 브랜치 (일반적으로 "마스터") 로의 푸시는 인스턴스 수준에서 비활성화 될 수 있습니다. 즉, "master"가 보호되지 않더라도 사이트 관리자 인 경우에도 기본 분기에 강제 푸시를 수행 할 수 없습니다. 권한이 있다고 가정하면 기본 분기를 다른 것으로 전환하고 강제 푸시를 수행 한 다음 다시 전환하여 일시적으로이 문제를 해결할 수 있습니다.
Christopher Hunter

2

이 문제를 해결하는 가장 좋은 방법은 원격 분기를 삭제하고 다시 보내는 것입니다.

git push origin master --delete
git push origin master

0

현재 분기가 PULL에 대해 올바르게 구성되지 않았기 때문에 문제가 발생합니다 . 먼저-를 사용하여 풀에 대해 업스트림 분기가 제대로 구성되었는지 확인합니다 git remote show origin. 섹션에서 찾을 수 있습니다- 'git pull'에 대해 구성된 로컬 브랜치 : . 그렇지 않은 경우 다음을 사용하여 구성하십시오.

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

자리 표시 자에 대한 적절한 지점 이름 제공 -MYBRANCH


0

이 명령 그룹을 사용하여 원격 리포지토리를 재설정하면 로컬 리포지토리를 다시 초기화하고 원격 리포지토리와 다시 연결 한 다음 업데이트를 강제로 푸시합니다.

이 방법은 귀하의 경우에는 작동하지 않지만 다른 사람에게는 유용 할 수 있습니다.

소스 폴더로 이동 한 다음 명령을 실행 https://github.com/*.git하십시오. 원격 저장소 링크입니다.

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**


0

나를 위해 @svick의 힌트는 올바른 방향을 가리 켰습니다. 내가 수정하려는 git 서버가 실제로 내 상자이기 때문에 로그인하고 git config --global receive.denynonfastforwards false모든 repos를 변경하여 강제 비 ff 푸시를 수락했습니다. 상자에서 작동하지 않았습니다. 내가 찾은 것은 구성에 이미 receive.denynonfastforwards=true설정되어 있으며 .NET으로 지울 수 없다는 것입니다 git config --global --unset receive.denynonfastforwards. vi config그래도 repo에서 수동으로 편집 ( )은 작동했습니다.


0

저장소 설정에서 보호되는 분기 규칙을 초과하는 기본 분기를 보호 및 기본에서 제거하여 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.