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


80

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

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

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


2
당신이 한 때 git rebase --skip(대신 --continue) 그것은 당신이 실제로 여전히 REBASE 동안 의미있는 변화가 있었다 변경을 "생략"수 있습니까?
CB Bailey

2
수동으로 병합 한 경우 일반적으로 --continue. 병합 결과가 "변경 없음"인 경우에만 건너 뛰면됩니다. 얼마나 많은 변경 사항을 건너 뛰고 실제로 얼마나 많이 적용 했습니까?
CB Bailey

14
나는 새로운 규칙이 : 아니오 오전 1시 후 리베이스
ryan0

3
리베이스가 잘못되는 문제를 피하는 쉬운 방법은 시작하기 전에 분기를 만드는 것입니다. 또한 최종 결과를 원본과 더 쉽게 비교할 수 있습니다. 완료되면 분기를 삭제하십시오.
jpmc26

2
이 (https : //) goo.gl/YQUyi1은 시간을 절약했습니다.
InaFK

답변:


199

차이가 없다면 변경 사항을 잃어버린 것 같습니다. 를 사용 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"를 검색합니다. 첫 번째 히트는 변경 사항을 다른 브랜치로 이식하는 것에 대해 이야기하는 섹션에 도착합니다.


당신이 옳았; 잘못된 명령을 사용했습니다. 나는 말해야했다. 이제 리베이스 패치가 생겼습니다 :) (다시 실행해야했지만 두 번째로 충돌을 수정하는 것이 훨씬 쉽습니다).
dave

23
git reset --hard xxxxx나를 구했다! 나는 모든 것을 잃어버린 줄 알았는데! 심지어 git reset xxxx(가)없이 --hard작동하지 않았다!
Chloe

7
비슷한 것을 보았습니다. 전 직장에서 봤는데 오늘도 봤어요. 저장소는 누군가가 일반 git rebase(업스트림에 반대)이 모든 로컬 커밋을 잃고 헤드를 업스트림으로 설정 하는 상태가 될 수 있습니다 . 반면에 git rebase -i어떤 변화가 (모든 것이 선택됩니다) 올바르게 작동합니다. 솔직히 일종의 모호한 버그라고 생각합니다.
Ryan Lundy

11
OMG! 넌 나를 구했다! D : 나는 reflog 후 체리 선택했다
페르난도 마르티네스

3
당신은 내 하루를 구했습니다!
Tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.