[git] 리베이스 후 변경 사항이 손실 되었습니까?

저는 최근에 제가 작업하고있는 지점을 다시 작성했습니다. 나무의 역사는 다음과 같습니다.

1 = 2 = 3 = 4
     \
      5 = 6 = 7
           \
            8

내 변경 사항 (다이어그램의 8 번)을 마스터 브랜치 (지금 다이어그램에서 4 번 커밋)로 리베이스하고 싶었습니다. 그래서 다음을 수행했습니다.

git checkout my_branch
git rebase master

<많은 git mergetool / git rebase-건너 뛰어 충돌 해결>

지금 만 실행할 때 :

git checkout my_branch
git diff master

나는 차이가 없습니다. 브랜치를 잃어버린 것은 아니지만 (저장 한 패치에서 변경 사항을 다시 생성 할 수 있음) 내가 한 병합 / 리베이스를 찾을 수 없습니다. 내가 뭘 잘못 했어? 변경 사항이 마스터와 병합 된 리베이스가 여전히 어딘가에 있습니까? 아니면 다시 수행해야합니까?



답변

차이가 없다면 변경 사항을 잃어버린 것 같습니다. 를 사용 git reflog하여 리베이스 이전에 존재했던 브랜치를 식별하고을 사용 git reset --hard <my-branch-tip-before-rebase>하여 원래 브랜치를 되 찾을 수 있습니다. 그리고 예, 프로세스를 다시 실행해야합니다. 🙁

나는 당신이 어떻게 그들을 똑같이 보이게했는지 잘 모르겠습니다. 나는 당신이 준 명령으로 다음을 볼 것으로 예상했을 것입니다.

1 = 2 = 3 = 4              (master)
     \       \
      \       5' = 6' = 8' (my_branch)
       \
        5 = 6 = 7

이 경우 아마도 다음을 사용해야합니다 rebase --onto.

git rebase --onto master <commit id for 6> my_branch

그러면 다음과 같은 그래프가 생겼을 것입니다.

1 = 2 = 3 = 4              (master)
     \       \
      \       8'           (my_branch)
       \
        5 = 6 = 7

변경 사항을 잃는 한, 특히 거의 동일 해 보이는 두 개의 큰 블록이있는 경우 병합 충돌을 처리하는 데 약간의 연습이 필요합니다. 나는 항상 커밋에 의해 도입 된 실제 차이를보고 그 변화를 알아 내고 적절한 방식으로 이미 브랜치에있는 것과 병합하려고 시도합니다. 나는 당신의 변화가 거기에서 어떻게 손실되었는지 쉽게 볼 수 있습니다.

기억해야 할 한 가지. 병합 충돌이 많이 발생할 것으로 예상하지 않는 경우-소스가 충분히 갈라 졌다고 느끼지 않기 때문에 소스를 보는 것은 잘못된 일을한다는 경고 플래그입니다. 을 수행 git rebase --abort하고 분기를 조사하고 충돌이 예상되는지 다시 확인 하여 백업하는 것이 좋습니다 . 충돌이 발생한 위치를 기록해 두십시오 (일반적으로 rebase가 명령 줄로 이동하기 직전에 “Applying …”이 있습니다). 일반적으로 시작하기에 좋은 곳입니다.

때때로 갈등은 피할 수없고 해결하기가 지루합니다. 그러나 나는 연습을 통해이 문제에 덜 부딪 힐 것이라고 생각합니다.

브랜치 간 변경 사항 이식에 대한 자세한 내용은 git rebase man 페이지를 참조하십시오. “rebase –onto”를 검색합니다. 첫 번째 히트는 변경 사항을 다른 브랜치로 이식하는 것에 대해 이야기하는 섹션에 도착합니다.


답변