2016-12-15 3 views
2

리팩토링 및 충돌 문제를 해결 한 후 가끔이 문제가 발생합니다. 나는 git add .을 실행했는데 git rebase --continue을 실행할 것입니다.충돌이 수정 된 후 git rebase가 발생했습니다.

그러나, 나는 가끔 이런 일이 왜 나는 이해하지

Applying: xxxxxx 
No changes - did you forget to use 'git add'? 
If there is nothing left to stage, chances are that something else 
already introduced the same changes; you might want to skip this patch. 

이 메시지가 표시됩니다. 그래서, 나는 결국 git rebase --skip을 처리하는 것으로 끝납니다. 누가 Git이 내가 갈등을 해결했다는 것을 깨닫지 못하는지 말해 줄 수 있니?

답변

3

Git의 저자는 이것이 좋은 안전 장치라고 생각하기 때문에 힘내네가 당신이 갈등을 해결했다는 것을 깨닫지 못합니다.

이것은 당신이 git rebase이, 여부를 효율적으로 또는 실제로 정확히 같은 입니다 반복 체리 따기 - 변화의 단지 많은 것을 체리 따기가 기억 확약 할 때 발생하지만 매우 유사 으로 리베이스중인 커밋에 이미 변경이 있습니다. 예를 들어

, 원작이 이렇게되면 가정 :

...--o--*   <-- origin/develop 
     \ 
      A--B--C <-- develop 
여기

A, BC 당신이 만든 세 커밋합니다. *은 처음 시작했을 때 develop 인 곳이며 origin/develop은 여전히 ​​기억합니다.

커밋 A에서 파일 a에있는 내용을 수정하고 README.txt 파일을 업데이트합니다. B에서 파일 b에있는 내용을 수정했지만 README.txt을 잊어 버리십시오. 커밋에서 C을 업데이트하면 README.txt을 업데이트해야합니다.

이제 다른 사람이 만든 변경하고 업스트림 서버에 밀어 때문에 git fetch자신의 일 :

...--o--*--D--E  <-- origin/develop 
     \ 
      A--B--C <-- develop 

하고 새로운 origin/developgit rebase 당신의 develop로 이동합니다.

...--o--*--D--E   <-- origin/develop 
     \  \ 
      \  A'-B'-C' <-- develop 
      \ 
      A--B--C  [abandoned] 

이 새로운 A'-B'-C' 커밋은 단순히 : 일반 이러한 의지는 모두가 잘된다면, 당신은 끝낼 것이다, 그래서A, B, 새로운 커밋 A', B'-CC' 복사 git cherry-pick 원본 복사본.

힘내는 A정확히 동일하게 변경 D 또는 E 중 하나에서 또한을 소개 커밋하면 충분히 똑똑하다, 힘내 것이다 단순히 드롭A 때 복사 : 그것을 건너 뛰고 복사합니다 단지 BC . 그러나이 의미에서 A이 "D과 같습니다."또는 두 번째 대소 문자가 참인 경우 - A이 완전히 분리되어 잘 복사되는 경우를 가정 해 봅니다.그러나 B도 아니고C도 "같음"E이 아니라 "E"이라는 합이 B+C 인 것입니다. 즉, 여러분과 그들은 을 동일한 수정으로 만들었지 만 그들은 을 하나의 커밋으로 수정하는 것을 기억하고 ... b 파일의 변경 사항에 약간의 철자 차이가 있습니다 - 또는 아마도 b 파일이 재구성되었거나 뭔가가 있었기 때문에 Git 귀하의 변경 사항을 그대로 적용하는 것.

너는 손으로 들어가서 힘내는 약 b에 대해 불평하고있다. 힘내는 사람이 B을 선택하여 B'이되도록 체리를 고르려고하는 동안 불평을한다. 그런 다음 git add 해결 된 파일입니다. 하지만 이제 파일 b은 정확히 업스트림 b과 일치합니다. 이것은 의도적으로 이루어 지지만, 결국 b 파일을 제출할 수 없습니다. Git은 귀하가 그 사실을 확인했는지 알 수 없습니다. 힘내 줄 아마도 git checkout HEAD -- b 그들의 버전이 무엇인지 보았다고 생각합니다. 이 경우 b을 추출하고 모든 문제가 해결 된 것으로 가정하고 동일한 상황에서 다른 방법으로 남겨 둡니다. 1

그래서,이 이후 완전히 B를 저지하락 것입니다, 힘내 당신에게이 경고를 제공합니다. 올바른 것 인 경우 지금 B의 커밋을 삭제하면 결국 git rebase --skip을 실행하고 B은 건너 뜁니다.

이제 C을 적용하여 README.txt을 수정하려고합니다. 그들은 이미 그들의 커밋에서 그것을했기 때문에 이것은해야 할 일이 전혀 없습니다. D. 여러분의 힘내네가 다시 한번, 자동적으로, 심지어 이번에는 해결 된 후, 충돌을 볼 것입니다. 망할 놈이 잘못했을 지 궁금해하고 git rebase --skip을 실행하여 이것이 맞는지 확인하십시오.

작업이 완료되면

, 그것은 단지 A 복사 할 필요가 있다고 밝혀, 당신은 실제로으로 끝날 :

...--o--*--D--E  <-- origin/develop 
     \  \ 
      \  A' <-- develop 
      \ 
      A--B--C [abandoned] 

하지만 힘내되고 싶어 정말 확실 그에서 BC을 생략 꽤 문자 적으로는 비교적 쉽기 때문에 복사가 정확합니다. git rebase --continue을 실행할 때에서 git add까지를 잊어 버렸습니다. 좋은 내장 git cherry-pick 명령하지 당신은 매우 초기에, 실현 경우


1이 더 의미가 있고, 힘내 않았다. 대신, 리베이스가 커밋을 패치로 바꾸고 누군가가 여러분에게 메일을 보낸 것처럼 패치를 적용하려고했습니다. 힘내라 그러면 패치를 전혀 적용하지 않았다는 것을 알 수 없다.

관련 문제