2012-10-31 2 views
39

최근에 작업하고 있던 지점을 리베이스했습니다. 나무의 역사는 다음과 같이보고 :리베이스 후 변경 사항을 잃어 버렸습니까?

나는 (지금 그림의 4 커밋까지) 마스터 분기로 내 변경 (그림의 숫자 8) 리베이스 싶어
1 = 2 = 3 = 4 
    \ 
     5 = 6 = 7 
      \ 
      8 

.

만 지금은 실행할 때> 충돌을 해결하는 --skip 리베이스 자식 mergetool의

git checkout my_branch 
git rebase master 

< 많은/자식 :

git checkout my_branch 
git diff master 

나는 제로 차이를 얻을 그래서 나는 다음과 같은했다. 나는 지사를 잃어 버리지 않았지만 (내가 저장 한 패치에서 변경 사항을 다시 만들 수는 있지만) 내가 한 병합/리베이스를 찾을 수 없습니다. 나는 무엇을 잘못 했는가? 리스터 레이즈가 마스터와 병합 된 어딘가에 여전히 있습니까? 아니면 다시해야합니까?

+0

'--continue' 대신에'git rebase --skip'을했을 때 실제로 리베이스하는 동안 의미있는 변화가 있었던 변경을 건너 뛰었을 수 있습니까? –

+0

이 답변보기 : http://stackoverflow.com/a/4851776/450609.나는 수동으로 병합 한 변경을 건너 뛰기 위해 git rebase --skip을 사용해야했습니다. – dave

+1

수동으로 병합 한 경우 대개 '--continue'를 원합니다. 병합 결과가 "변경되지 않음"일 경우 건너 뛸 필요가 있습니다. 얼마나 많은 변경 사항을 건너 뛰고 실제로 얼마나 많은 변경 사항을 적용 했습니까? –

답변

97

아무런 차이가없는 경우 변경 사항을 잃어버린 것 같습니다. 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 사용했습니다해야합니다

1 = 2 = 3 = 4    (master) 
    \  \ 
     \  8'   (my_branch) 
     \ 
     5 = 6 = 7 
:이처럼 보였다 그래프 당신을 떠난 것

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

변경 사항을 잃어 버리는 경우 병합 충돌을 처리하는 데 약간의 연습이 필요합니다. 특히 거의 비슷한 두 개의 큰 블록이있는 경우 더욱 그렇습니다. 나는 항상 커밋에 의해 도입 된 실제 diff를보고, 그 변화를 애타게하고 적절한 방법으로 이미 브랜치에있는 것과 병합하려고 시도한다. 나는 당신의 변화가 어떻게 그 길에서 사라 졌는지 쉽게 볼 수 있습니다.

기억해야 할 한 가지. 여러 가지 병합 충돌이 예상되지 않으면 소스가 충분하게 분기되지 않았기 때문에보고있는 것은 잘못된 일을하는 경고 플래그입니다. git rebase --abort을 수행하여 지점을 조사하고 충돌이 있는지 다시 확인하여 백업하는 것이 좋습니다. 충돌이 발생한 곳을 기록해 두십시오 (rebase가 명령 줄을 시작하기 바로 전에 보통 "적용 중 ..."이 있습니다). 그것은 대개 시작하기에 좋은 곳입니다.

때로는 충돌이 불가피하며 작업이 지루합니다. 하지만 연습 문제로 생각하면 문제가 줄어들 것입니다.

분기 간 변경 사항 이식에 대한 자세한 내용은 git rebase 매뉴얼 페이지를 참조하십시오. "rebase --onto"를 검색하십시오. 첫 번째 히트는 다른 지점으로 변경 사항을 이식하는 것에 대해 이야기하는 섹션에 착륙해야합니다.

+0

당신이 옳았습니다. 나는 잘못된 명령을 사용했다. 나는 말할 필요가 있었다. 나는 지금 내 rebased 패치를 가지고있다. (그리고 나는 다시해야했지만 두 번째 충돌을 수정하는 것이 훨씬 쉽다). – dave

+0

굉장! 다행히 도왔다! 그리고 네, 똑같은 것을 발견합니다. 갈등은 두 번째로 훨씬 쉬울 것입니다. 한 가지 흥미로운 특징이 있습니다. Scott Chacon은 시설에 [멋진 기사] (http://git-scm.com/2010/03/08/rerere.html)를 갖고 있으며 충돌을 해결할 때 매우 유용합니다. 같은 것을 반복해서. – jszakmeister

+6

'git reset --hard xxxxx' 저를 구 했어요! 나는 모든 것이 손실되었다고 생각했다! '--hard'가없는'git reset xxxx'조차도 작동하지 않았습니다! – Chloe

관련 문제