2014-05-25 4 views
7

기존 병합 커밋에서 충돌 해결을 재사용하도록 Git에 지시 할 수 있습니까? 나는 커밋 할 때 다시 사용할 수 없게했다. 새 병합 커밋에는 병합의 "우리"측면에 대한 몇 가지 추가 커밋이 포함되어 있지만 다른 파일 집합을 수정하면서 새로운 충돌이 발생해서는 안됩니다.Git과의 재사용 충돌 해결


예를 들어, 다음 DAG을 :

m [master] Add new stuff 
* 
| o [old-master] Merge branch A (conflicts) 
|/a [branch A] 
n * 
* * 
*/ 
* 

를 자, 내가 원하는 것은 분기 old-master에 커밋 mm^을 가지고 (그리고 나중에 새 마스터 있는지 확인). masterold-master에 병합하고 싶지는 않습니다. 충돌이 없더라도 새로운 병합 커밋을 생성합니다. 부모와 같이 oma으로 재 작성하고 싶습니다.

새로운 DAG가 보일 것 같은 :

p [old-master] Merge branch A (same conflict resolution as old commit o) 
/| 
m | [master] Add new stuff 
* | 
| a [branch A] 
n * 
* * 
*/ 
* 

내가 (o를) 커밋 기존 병합의 해상도를 기록 할 나중에 그것을 말할 수 있다면, rerere를 사용하여 상관하지 않습니다.

+0

git config rerere.enabled true # with rerere turned on, git checkout $o^1 # rerun the original merge git merge $o^2 git read-tree --reset -u $o: # resolve conflicts exactly as before git commit # throwaway commit to feed the results to rerere 

그리고 당신이 그 갈등 무슨 짓을했는지 지금 rerere가 보았다 @ jthill : 저는 다른 질문이 똑같은 것을 성취하려고 시도하지 않는다고 생각합니다. 그들은 충돌로 병합을 다시하지 않고, 나중에 온 병합을 다시하고 있습니다 (충돌이 없었습니다). – knittl

+0

예,하지만 새로운 커밋을 포함하지만 충돌 해결 (ASCII DAG에서'o'와'p')이있는 새로운 커밋 'n'으로 'n'을 대체하고 싶습니다. – knittl

+0

스레 싱에 대해 유감스럽게 생각합니다. 내 자신의 코드를 잘못 읽음으로써 선전을하기에 좋은 댓가를 치렀다. [거기에 무슨 일이 벌어지고 있는지 지금 분명해?] (http://stackoverflow.com/a/21952372/1290731) Rerere를 선택하고 이전 해상도를 다시 실행하는 것이 Rerere가 옵션 인 경우 꽤 분명합니다. – jthill

답변

9

당신이 요구하는지 무엇을 구현하는 가장 간단한 방법은 소급에 rerere 설정하는 아마 :

git checkout -B old-master $o^1 # rewind `old-master` to before the merge 
git merge master    # rerun it with current ancestry 
+1

커밋에 올바른 인덱스 상태를 생성하려면'git read-tree --reset -u $ o'를 사용해야했습니다 –