git에서 다시 반대되는 병합을 다시 조정합니다
-
21-08-2019 - |
문제
나는 여기서 약간의 문제가 발생했습니다. 문제에 따른 지점이있었습니다. 28s
git에서, 나는 장군에 합병했다 develop
나뭇가지. 너무 빨리 해냈으므로 GIT-REVERT를 사용하여 병합을 취소했습니다. 그러나 이제 시간이 합병되었습니다. 28s
~ 안으로 develop
, 그러나 Git-Merge Command는 원래 병합을보고, 모든 것이 잘되고 분기가 이미 합병되었다고 행복하게 발표합니다. 지금 무엇을합니까? '리버스 "리버스 (Revert)"28S -> 개발 ""커밋을 만듭니다. 좋은 방법이 아닌 것 같지만 현재 다른 사람은 상상할 수 없습니다.
트리 구조의 모습 :
해결책
당신은 "반복 되돌아 가야합니다". 어떻게 되돌아 갔는지에 달려 있습니다. 를보세요 이 주제에 대한 공식 문서.
---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은 매우 자연스럽게 해냈으며 실제 문제가 없었습니다.
그것은 단지 그것이 "병합 전"에서 "병합 후 상태"로 변경되는 것으로 간주했는데, 그게 바로 그랬습니다.
복잡한 것은없고 이상한 것이없고 실제로 위험한 것은 없습니다. Git은 그것에 대해 생각조차하지 않고 그것을 할 것입니다.기술적 인 각도에서 합병을 되 돌리는 데 아무런 문제가 없지만 워크 플로 각도에서 그것은 일반적으로 피하려고 시도하는 것입니다..
예를 들어, 가능한 경우, 메인 트리에 합병 된 문제를 발견하면 병합을 되돌리지 않고 시도하십시오 진짜 ~하기 힘든:
- 합병 한 지점으로 문제를 이등분하고 그냥 고치십시오.
- 또는 그로 인한 개인 커밋을 되돌려 보려고 노력하십시오.
예, 그것은 더 복잡하고, 아니, 그것은 항상 작동하지는 않을 것입니다 (때로는 대답은 다음과 같습니다. 모두 합병의 "). 그러면 합병을 되돌려 야하지만 병합을 다시 만들려면 이제 되돌아 가야합니다.
다른 팁
당신이 그런 역사를 가지고 있다고 가정 해 봅시다
---o---o---o---M---W---x-------x-------*
/
---A---B
A, B가 실패하고 W-가 M을 되돌립니다.
그래서 문제를 해결하기 전에 문제를 해결하기 전에 나는 내 지점에 w의 체리-픽을합니다.
git cherry-pick -x W
그런 다음 지점에서 W Commit을 되돌립니다
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
분기 버리세요 (undo) 잘못된 병합 커밋 (그냥 되 돌리는 대신).
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
또한 작업 디렉토리의 내용을 적절하게 조정합니다. 조심하세요:
- 변경 사항을 저장하십시오 개발 지점에서 (잘못된 병합 이후)
git-reset
. 모든 사람은 당신이 지정한 다음으로 커밋됩니다git reset
논쟁이 사라질 것입니다! - 또한 재설정이 기록을 다시 작성하기 때문에 다른 저장소에서 변경이 이미 가져온 경우 에도이 작업을 수행하지 마십시오.
나는 공부하는 것이 좋습니다 git-reset
이것을 시도하기 전에 신중하게 사람 페이지.
이제 재설정 후 변경 사항을 다시 적용 할 수 있습니다. devel
그리고 그렇게합니다
git checkout devel
git merge 28s
이것은 진정한 병합이 될 것입니다 28s
~ 안으로 devel
초기와 마찬가지로 (이제 Git의 역사에서 지워졌습니다).
방금 같은 문제에 직면 할 때이 게시물을 찾았습니다. 나는 위에서 위에서 하드를 재설정하는 데 무섭다는 것을 알게됩니다. 나는 내가 원하지 않는 것을 삭제하고 그것을 되 찾을 수 없을 것입니다.
대신 나는 지점이 EG로 돌아 가기를 원했던 커밋을 확인했다. git checkout 123466t7632723
. 그런 다음 지점으로 변환했습니다 git checkout my-new-branch
. 그런 다음 더 이상 원하지 않는 지점을 삭제했습니다. 물론 이것은 당신이 엉망인 지점을 버릴 수있는 경우에만 효과가 있습니다.
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
이제 지점에 대한 PR을 만듭니다 users/yourname/revertOfSHA1
- 원래 병합 이전에 Commit에서 새 지점 만들기 - '개발 -베이스'라고 부릅니다.
- '개발 기반'위에 '개발'의 대화식 레바이스를 수행하십시오 (이미 맨 위에 있지만). 대화식 Rebase 중에는 합병 커밋과 합병을 역전시킨 커밋을 모두 제거 할 수있는 기회가 있습니다. 즉, GIT 이력에서 두 사건을 모두 제거합니다.
이 시점에서 정기적으로 그렇듯이 피처 브라크를 병합 할 수있는 깨끗한 '개발'지점이 있습니다.