Git 병합 롤백


225
develop branch
--> dashboard (working branch)

git merge --no-ff develop업스트림 변경 사항을 대시 보드에 병합하는 데 사용 합니다

자식 로그 :

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

병합에는 약 50 개 이상의 커밋이 있었으며 대시 보드가 상태 사전 병합으로 돌아가도록 병합을 되 돌리는 방법이 궁금합니다.

이것의 두 번째 부분은와 병합 --no-ff하지 않으면 ' 병합 지점'개발 '을 대시 보드에 병합' 커밋을 얻지 못합니다 . 어떻게 병합을 롤백합니까?


3
Git 병합 실행 취소의 가능한 복제 ? .

답변:


321

병합 커밋 되돌리기는 다른 질문 에서 철저히 다루었습니다 . 두 번째로 설명하는 빨리 감기 병합 git reset을 수행하면 이전 상태로 돌아갈 수 있습니다 .

git reset --hard <commit_before_merge>

<commit_before_merge>with git reflog, git log또는 moxy를 느끼는 경우 (그리고 다른 작업을 수행하지 않은 경우)를 찾을 수 있습니다 .git reset --hard HEAD@{1}


6
빠른 회신 주셔서 감사합니다 .. 자식 로그를 보면 git merge 개발이 실제로 다른 모든 커밋에 넣기 때문에 병합하기 전에 커밋이 50 + 커밋됩니다. 내가 무엇을 얻지 못했는지, 그 병합이 무엇인지 / 어디에 있는지 모른다면 어떻게 알 수 있습니까? 당신은 commit_before_merge를 찾는 것을 언급했다. 나는 그 부분을 이해하지 못하는 것 같다
cgmckeever

4
git reflog와 같이 보입니다. 마지막 헤드를 멋지게 요약하고 어디에서 재설정 해야하는지 알 수 있습니다. git log는 재설정 할 장소를 정확하게 나타내기에는 너무 세분성이있는 것 같습니다. 감사합니다
cgmckeever

1
그래, reflog생명의 은인 HEAD@{1}HEAD의 두 번째 최신 상태 또는보다 기술적으로 설명합니다. "괄호 쌍 (예 : {1}, {15})으로 묶인 서수 지정이있는 접미사 @가 붙은 참조는 해당 값의 n 번째 이전 값을 지정합니다. 심판. "
Christopher

4
되돌리기를 리모컨으로 푸시하는 것은 어떻습니까? 어떻게 작동하는지 모르겠습니다.
Anton Savelyev

2
희망이 없습니다. 병합 후 모든 커밋을 삭제합니다.
aaa90210

151

여기에서:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

힘내 되돌리기는 지정된 커밋을 롤백하는 새로운 커밋을 추가합니다.

-m 1을 사용하면 이것이 병합임을 알리고 마스터 브랜치의 상위 커밋으로 롤백하려고합니다. -m 2를 사용하여 개발 분기를 지정합니다.


30
문서에서 다음과 같이 말합니다. "병합 커밋을 되 돌리면 병합에서 트리 변경을 가져 오지 않을 것이라고 선언 할 수 있습니다. 결과적으로 나중에 병합하면 트리 변경 사항 만 가져옵니다. 이전에 되돌려 진 병합의 조상이 아닌 커밋에 의해. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. "
달리 보르 카를로 비치

23
@ DaliborKarlović 그 말은 조금 가혹합니다. 나중에 변경 사항을 다시 가져올 수 있습니다. 요령은 되돌리기 커밋을 되 돌리는 것입니다. "복귀 되돌리기"섹션에 대한 자세한 내용은 여기
Hilikus

3
슬프게도 here@Hilikus 주석 의 링크는 더 이상 유효하지 않습니다. 이 사이트는 콘텐츠가 책 ( git-scm.com/book/en/v2 ) 으로 옮겨 졌다고 주장 하지만, 그 책 을 찾는 것은 쉽지 않습니다.
Jesse Chisholm

@ DaliborKarlović는 이것이 @Christopher에서 위의 답변에 해당합니까?
James B

3
실행 취소 병합 컨텐츠가 여기
SEK

28

로 병합 커밋을 재설정하십시오 git reset --hard HEAD^.

--no-ff를 사용하면 사이에 아무것도 커밋하지 않더라도 항상 병합이 생성됩니다. --no-ff git이 없으면 빨리 감기를 수행하므로 분기 HEAD가 병합 된 분기의 HEAD로 설정됩니다. 이를 해결하려면 되돌릴 commit-id를 찾으십시오 git reset --hard $COMMITID.


1
병합하기 전에 커밋을 모르는 경우 좋은 솔루션입니다.
iglesiasedd

커밋 ID +1을 알지 못해서 나를 위해 일했습니다.
Anant Singh ---

원하지 않는 병합이 이미 원격에 커밋 된 경우 git push -f 를 사용 하여 되 돌린 후 원격 분기를 업데이트했습니다.
주멕

16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

그러나 예기치 않은 부작용이있을 수 있습니다. git-scm.com/docs/git-revert의--mainline parent-number 옵션을 참조하십시오

아마도 무자비하지만 효과적인 방법은 해당 커밋의 왼쪽 부모를 확인하고 모든 파일의 복사본을 만들고 HEAD다시 체크 아웃 한 다음 모든 내용을 이전 파일로 바꾸는 것입니다. 그런 다음 git은 롤백되는 것을 알려주고 자신의 되돌리기 커밋을 만듭니다 :)!


1
이 답변은 재설정과 마찬가지로 기록을 엉망으로 만들지 않기 때문에 +1 (이미 원격으로 푸시 한 경우 실제로 중요합니다). 그러나 예상치 못한 부작용은 무엇입니까?
pedromanoel

3
이것이 당신이 언급 한 부작용입니까? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
pedromanoel

1
당신 git reset은 해결책 이라고 말하지만 예상치 못한 부작용이있을 수 있다고 언급합니다. 그러나 그 링크는 다음이 git revert아닙니다. git reset:)
Mark

2
git reset에는 -m 플래그가 없습니다. 또한 @JorgeOrpinel은 git-reset이 아닌 git-revert 문서를 참조합니다. 나는 그가 말을 의미 생각 git revert하지git reset
데빈 글리슨 램버트

메인 라인을 지정하지 않았지만 커밋 1234xyz 를 피하는 방법 은 병합 오류 가 아닙니다 .
Achal

0

분기를 병합 한 경우 풀 요청을 사용하여 병합을 되돌리고 해당 풀 요청을 병합하여 되돌립니다.

내가 느끼는 가장 쉬운 방법은 다음과 같습니다.

  1. 개발 / 마스터 (병합 한 곳)에서 새 지점을 가져옵니다.
  2. (리버 트 git revert -m 1 xxxxxx가 브랜치를 사용하여 병합 된 git revert xxxxxx경우 ) 또는 간단한 되돌리기 인 경우를 사용하여 "리버 트"를 되돌리기
  3. 새 브랜치에 변경 사항을 다시 병합해야합니다.
  4. 이 지점을 변경하거나 병합하여 개발 / 마스터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.