Programming

Git에서 되 돌린 병합 다시 실행

procodes 2020. 5. 6. 22:15
반응형

Git에서 되 돌린 병합 다시 실행


여기에 약간의 문제가 있습니다 28s.Git에 문제 별 분기가 있었으며 일반 develop분기에 병합되었습니다 . 너무 빨리 수행 한 것으로 나타 났으므로 병합 취소를 위해 git-revert를 사용했습니다. 그러나 이제는으로 병합 28s시간이 develop되었지만 git-merge 명령은 원래 병합을보고 모든 것이 정상이고 분기가 이미 병합되었음을 알려줍니다. 지금 무엇을해야합니까? 'Revert "28s-> develop"되돌리기'커밋을 만드시겠습니까? 그것을하는 좋은 방법은 아니지만 지금은 다른 상상할 수 없습니다.

트리 구조는 다음과 같습니다.

힘내 로그 출력


"되돌리기"를해야합니다. 원본 복귀 방법에 따라 들리는 것처럼 쉽지 않을 수 있습니다. 이 주제에 대한 공식 문서를 보십시오 .

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

허용하기 위해:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

그러나 모두 작동합니까? 물론입니다. 병합을 되돌릴 수 있으며 순수한 기술적 인 각도에서 git은 매우 자연스럽게 처리했으며 실제로 아무런 문제가 없었습니다.
방금 "병합 전 상태"에서 "병합 후 상태"로의 변경을 고려한 것입니다.
복잡한 것도없고 이상한 것도없고 정말 위험한 것도 없습니다. 힘내 생각조차하지 않고 그것을 할 것입니다.

따라서 기술적 인 측면에서 병합을 되 돌리는 데 아무런 문제가 없지만 워크 플로 각도에서는 일반적으로 피해야하는 것 입니다.

당신은 메인 트리에 통합있어 문제가 발견되면 모두가, 예를 들어, 수에하면 오히려 병합 되돌리기보다는를하려고 정말 열심히 :

  • 병합 한 지점으로 문제를 나누고 해결하십시오.
  • 또는 원인이 된 개별 커밋을 되돌리려 고합니다.

그래, 더 복잡하고, 아니, 항상 일을하지 않을 것 (때로는 대답은 "죄송합니다, 아직 준비가되지 않았기 때문에 난 정말 그것을 통합 안, 나는 정말 취소해야 모든 의를 병합 "). 따라서 병합을 되돌려 야하지만 병합을 다시 실행하려면 되돌리기를 되돌려 야합니다.


그런 역사가 있다고 가정 해 봅시다

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

A, B가 커밋에 실패하고 W-M을 되 돌리는 경우

그래서 발견 된 문제를 해결하기 전에 나는 지점에 W 커밋을 선택합니다.

git cherry-pick -x W

그런 다음 지점에서 W 커밋을 되돌립니다.

git revert W 

계속 고칠 수 있습니다.

최종 역사는 다음과 같습니다.

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

PR을 보내면 PR이 되돌리기 취소임을 분명히 표시하고 새로운 커밋을 추가합니다.


워크 플로우를 너무 많이 방해하지 않고 되돌리기를 되돌리려면 :

  • 개발의 로컬 쓰레기 복사본 만들기
  • 로컬 개발 사본에서 되돌리기 커밋 되돌리기
  • 해당 사본을 기능 분기로 병합하고 기능 분기를 git 서버로 푸시하십시오.

이제 준비가되면 기능 분기를 정상적으로 병합 할 수 있습니다. 여기서 유일한 단점은 기록에 몇 가지 추가 병합 / 복귀 커밋이 있다는 것입니다.


GIT에서 되돌리기를 되돌리려면 :

git revert <commit-hash-of-previous-revert>

대신 사용하는 git-revert당신은이 명령을 사용할 수도 devel하는 지점 버리고 잘못된 병합 (대신 그것을 되 돌리는의) 커밋 (취소).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

또한 작업 디렉토리의 내용을 적절하게 조정합니다. 조심하십시오 :

  • 병합이 잘못되었으므로 개발 브랜치에서 변경 사항저장하십시오git-reset . git reset인수 로 지정한 커밋 후 모든 커밋 이 사라집니다!
  • 또한 재설정이 히스토리를 다시 작성하므로 다른 저장소에서 변경 사항을 이미 가져온 경우이 작업을 수행하지 마십시오.

이것을 git-reset시도하기 전에 맨 페이지를주의 깊게 연구하는 것이 좋습니다 .

재설정 후 변경 사항을 다시 적용한 devel다음

git checkout devel
git merge 28s

This will be a real merge from 28s into devel like the initial one (which is now erased from git's history).


I just found this post when facing the same problem. I find above wayyy to scary to do reset hards etc. I'll end up deleting something I don't want to, and won't be able to get it back.

Instead I checked out the commit I wanted the branch to go back to e.g. git checkout 123466t7632723. Then converted to a branch git checkout my-new-branch. I then deleted the branch I didn't want any more. Of course this will only work if you are able to throw away the branch you messed up.


I would suggest you to follow below steps to revert a revert, say SHA1.

git checkout develop #go to develop branch
git pull             #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote

Now create PR for the branch users/yourname/revertOfSHA1


  1. create new branch at commit prior to the original merge - call it it 'develop-base'
  2. '개발 기반'위에 '개발'의 대화식 리베이스를 수행합니다 (이미 위에 있음에도 불구하고). 대화식 리베이스 중에는 병합 커밋과 병합을 취소 한 커밋을 모두 제거 할 수 있습니다. 즉, git history에서 두 이벤트를 모두 제거합니다.

이 시점에서 정기적으로하는 것처럼 기능 브레이 치를 병합 할 수있는 깨끗한 '개발'브랜치를 갖게됩니다.

참고 URL : https://stackoverflow.com/questions/1078146/re-doing-a-reverted-merge-in-git

반응형