아직 푸시되지 않은 Git 병합 실행 취소

내 마스터 브랜치 내에서 git merge some-other-branch로컬로 수행했지만 변경 사항을 원래 마스터로 푸시하지 않았습니다. 병합을 의미하지 않았으므로 실행 취소하고 싶습니다. git status병합 후 작업을 수행 할 때이 메시지가 나타납니다.

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

내가 찾은 지침에 따라 달리기를 시도했습니다.

git revert HEAD -m 1

하지만 지금이 메시지가 나타납니다 git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

나는 커밋이 앞당겨지기를 원하지 않습니다. 그 시점으로 돌아가려면 어떻게해야합니까?



답변

함께 git reflog일 이전에 병합이 커밋 검사 ( git reflog보다 더 나은 옵션이 될 것입니다 git log). 그런 다음 다음을 사용하여 재설정 할 수 있습니다.

git reset --hard commit_sha

또 다른 방법이 있습니다.

git reset --hard HEAD~1

커밋 1을 돌려줍니다.

수정 및 커미트되지 않은 / 스 태치되지 않은 파일은 수정되지 않은 상태로 재설정됩니다 . 변경 사항을 숨기거나 아래 --merge옵션을 참조하십시오 .


@Velmont는 그의 대답에서 아래에 제안한 것처럼,이 직접적인 경우에는 다음을 사용합니다.

git reset --hard ORIG_HEAD

변경 사항을 보존해야하므로 더 나은 결과를 얻을 수 있습니다. ORIG_HEAD병합이 발생하기 직전에 커밋을 가리 키므로 직접 찾아 볼 필요가 없습니다.


추가 팁은 불필요하게 파일을 재설정하지 않기 때문에 --merge대신 스위치 를 사용하는 것입니다 --hard.

git reset --merge ORIG_HEAD

-병합

인덱스를 재설정하고 <commit>과 HEAD간에 다른 작업 트리의 파일을 업데이트하지만 인덱스와 작업 트리간에 다른 파일 (예 : 추가되지 않은 변경 사항)은 유지합니다.


답변

로컬 마스터가 원산지 / 마스터보다 앞서 있지 않다고 가정하면

git reset --hard origin/master

그런 다음 현지 master지점이와 동일하게 보입니다 origin/master.


답변

Git 책의 4 장Linus Torvalds의 원본 게시물을 참조하십시오 .

병합 취소하려면 이미 밀렸다 :

git revert -m 1 commit_hash

Linus가 말한 것처럼 지점을 다시 커밋하는 경우 되돌리기를 되 돌리십시오.


답변

가장 간단한 명령이 누락 된 것은 이상합니다. 대부분의 답변은 효과가 있지만 방금 병합을 취소 하면 쉽고 안전한 방법입니다 .

git reset --merge ORIG_HEAD

심판 ORIG_HEAD은 합병 전의 원래 커밋을 가리 킵니다.

(이 --merge옵션은 병합과 관련이 없습니다. 마치 git reset --hard ORIG_HEAD커밋되지 않은 변경 사항을 건드리지 않기 때문에 마치 안전합니다.)


답변

최신 Git 버전에서는 아직 병합을 커밋하지 않았고 병합 충돌 이있는 경우 간단하게 수행 할 수 있습니다.

git merge --abort

보낸 사람 man git merge:

[이]는 병합으로 인해 충돌이 발생한 후에 만 ​​실행할 수 있습니다. git merge --abort병합 프로세스를 중단하고 병합 전 상태를 재구성하려고합니다.


답변

이전 커밋으로 재설정해야합니다. 이것은 작동해야합니다 :

git reset --hard HEAD^

또는 HEAD^^그 되돌리기 커밋을 되돌릴 수도 있습니다. 얼마나 많은 단계를 거쳐야할지 확실하지 않은 경우 언제든지 SHA 전체를 참조 할 수 있습니다.

문제가 있고 마스터 브랜치에 로컬 변경 사항이없는 경우로 재설정 할 수 있습니다 origin/master.


답변

최근에, 나는 이것을 git reflog돕기 위해 사용 하고 있습니다. 이것은 단지 병합 JUST가 발생하고 컴퓨터에있는 경우에만 작동합니다.

git reflog 다음과 같은 것을 반환 할 수 있습니다 :

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

첫 번째 줄은 병합이 발생했음을 나타냅니다. 두 번째 줄은 병합 전의 시간입니다. 나는 단순히 git reset --hard 43b6032합치기 전에이 지점을 추적하고 계속 수행하도록 강요한다.