Git 병합을 되돌리기 위한 최고의 가이드

4634 단어 git

푸시되지 않은 병합을 실행 취소하는 방법



병합을 완료하고 아직 푸시하지 않은 경우 병합 실행 취소는 매우 간단합니다.
git reset 명령을 사용하여 병합 전 개정으로 돌아가 효과적으로 실행 취소하십시오.

$ git reset --hard <commit-hash-before-merge>


병합하기 전에 커밋의 해시가 없는 경우 git log를 사용하여 찾거나 재설정 명령의 다음 변형을 사용할 수 있습니다.

$ git reset --hard HEAD~1


이렇게 하면 HEAD~1 를 사용하여 git에게 현재 HEAD 개정 이전의 커밋으로 돌아가도록 지시할 수 있습니다. 이 커밋은 병합 이전의 커밋이어야 합니다.

참고: 두 경우 모두 --hard 옵션을 사용해야 합니다. 즉, 커밋되지 않은 로컬 변경 사항은 폐기됩니다. 커밋되지 않은 중요한 변경 사항이 있는 경우 이전에 git stash를 사용해야 합니다.

위의 작업git reset을 수행하면 병합의 모든 변경 사항이 실행 취소되고 정상적으로 작업을 계속할 수 있음을 알 수 있습니다.

푸시된 병합을 실행 취소하는 방법



푸시된 병합을 실행 취소하는 것은 좀 더 복잡합니다. 그것에 도달하기 전에 커밋과 git 병합에 대해 조금 더 배울 필요가 있습니다.

커밋 부모란 무엇입니까?



모든 커밋에는 상위 커밋이 있습니다. git commit 정상적으로 현재 커밋은 생성 중인 새 커밋의 상위 커밋이 됩니다.

커밋의 상위 항목을 보려면 git show --pretty=raw <commit-hash> 를 사용하십시오.

병합 커밋이란 무엇입니까?


feature라는 브랜치가 master와 병합되면 브랜치master에 새로운 "병합 커밋"이 생성됩니다. 병합 커밋은 부모가 2개라는 점을 제외하면 일반 커밋과 동일합니다. 이 경우 병합 커밋의 두 부모는 master의 이전 헤드와 feature의 헤드가 됩니다.



실행 중git show 새 커밋은 두 상위 항목을 모두 표시합니다.

$ git show

commit ae2058cf5cafe807af44114d15bac65fc4efd714 (HEAD -> master)
Merge: bf75d61d8f1 12d62bfa0e0


자식 되돌리기는 어떻게 작동합니까?




git revert <commit-hash>


git의 되돌리기 명령은 커밋 해시를 가져와 변경 사항을 부모와 비교합니다. 델타 또는 diff가 계산되고 부정이 새 커밋으로 적용됩니다.

병합 커밋을 되돌리려면 어떻게 해야 합니까? 병합 커밋에는 2개의 부모가 있으며 git은 어떤 부모가 메인라인이고 어떤 부모가 병합 해제하려는 브랜치인지 자동으로 알지 못합니다.

병합 커밋 되돌리기




$ git revert -m 1 <merge-commit-hash>


이 명령이 수행하는 작업을 자세히 살펴보겠습니다.
  • git revert는 원치 않는 병합의 효과를 되돌리기 위해 새 커밋이 생성되었는지 확인합니다.
  • -m 1 옵션은 git에게 병합의 부모 쪽(우리가 병합한 브랜치)을 유지하고 싶다고 알려줍니다.
  • 마지막으로 실제 병합 커밋의 해시를 지정해야 합니다.
  • -m 옵션은 상위 번호를 지정합니다. 이는 병합 커밋에 하나 이상의 부모가 있고 git이 자동으로 어떤 부모가 메인라인이고 어떤 부모가 병합 해제하려는 분기인지 알지 못하기 때문입니다.
    git log 의 출력에서 ​​병합 커밋을 보면 Merge: 로 시작하는 줄에 나열된 부모를 볼 수 있습니다.

    commit ae2058cf5cafe807af44114d15bac65fc4efd714
    Merge: bf75d61d8f1 12d62bfa0e0
    Author: Michael Seymour <[email protected]>
    Date:   Sun May 08 13:52:29 2022 +0100
    
    Merge branch 'my-branch'
    


    이 상황에서 git revert ae2058cf5ca -m 1bf75d61d8f1에 있던 트리를 가져오고 git revert -m 212d62bfa0e0에 있던 트리를 복원합니다.





    상위 커밋을 더 잘 이해하려면 다음을 실행할 수 있습니다.git log bf75d61d8f1 또는 git log 12d62bfa0e0

    이번에는 git reset을 사용할 수 없는 이유는 무엇입니까?


    git revert는 원치 않는 병합의 효과를 되돌리기 위해 새 커밋이 생성되었는지 확인합니다. 이것은 기록에서 커밋을 효과적으로 "제거"하는 git reset 와 대조됩니다. 따라서 git revert는 원격 리포지토리의 기록을 변경하면 리포지토리를 사용하는 다른 개발자에게 문제를 일으킬 수 있으므로 이미 원격으로 푸시한 경우 더 나은 솔루션입니다.

    참조


  • https://www.git-tower.com/learn/git/faq/undo-git-merge
  • https://stackoverflow.com/q/7099833
  • https://levelup.gitconnected.com/reverting-a-merge-commit-7de2e9114c7d
  • https://git-school.github.io/visualizing-git/#free
  • 좋은 웹페이지 즐겨찾기