문제

나는 여기서 약간의 문제가 발생했습니다. 문제에 따른 지점이있었습니다. 28s git에서, 나는 장군에 합병했다 develop 나뭇가지. 너무 빨리 해냈으므로 GIT-REVERT를 사용하여 병합을 취소했습니다. 그러나 이제 시간이 합병되었습니다. 28s ~ 안으로 develop, 그러나 Git-Merge Command는 원래 병합을보고, 모든 것이 잘되고 분기가 이미 합병되었다고 행복하게 발표합니다. 지금 무엇을합니까? '리버스 "리버스 (Revert)"28S -> 개발 ""커밋을 만듭니다. 좋은 방법이 아닌 것 같지만 현재 다른 사람은 상상할 수 없습니다.

트리 구조의 모습 :

Git log output

도움이 되었습니까?

해결책

당신은 "반복 되돌아 가야합니다". 어떻게 되돌아 갔는지에 달려 있습니다. 를보세요 이 주제에 대한 공식 문서.

---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

  1. 원래 병합 이전에 Commit에서 새 지점 만들기 - '개발 -베이스'라고 부릅니다.
  2. '개발 기반'위에 '개발'의 대화식 레바이스를 수행하십시오 (이미 맨 위에 있지만). 대화식 Rebase 중에는 합병 커밋과 합병을 역전시킨 커밋을 모두 제거 할 수있는 기회가 있습니다. 즉, GIT 이력에서 두 사건을 모두 제거합니다.

이 시점에서 정기적으로 그렇듯이 피처 브라크를 병합 할 수있는 깨끗한 '개발'지점이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top