2013-10-20 3 views
1

나는 두 개의 브랜치 인 A와 B에서 작업하고 있었다. master 브랜치에서 프로젝트 히스토리에서 공간을 차지하고있는 큰 바이너리 파일을 제거하기로 결정했다. 나는 그렇게 사용 않았다내역에서 파일을 제거한 후 Rebase 브랜치

git filter-branch --force --index-filter \ 
'git rm --cached --ignore-unmatch "Filename"' \ 
--prune-empty --tag-name-filter cat -- --all 

은 A 분기 (this site에서 참조).

그러나이 작업을 수행 한 후에 다시 작성한 B 지점에서 작업을 다시 시작했습니다. 이 커밋 다음 트리 A1 및 A2는 B1과 누락 된 바이너리 파일을 제외한 B2와 같은 커밋이다

+----+ +----+     +----+ 
| A1 |->| A2 |---------------->| A5 | 
+----+ +----+     +----+ 
+----+ +----+ +----+ +----+ /
| B1 |->| B2 |->| B3 |->| B4 |--/ 
+----+ +----+ +----+ +----+ 

결과. 어떻게뿐만 아니라 B에서 이진 파일을 삭제하고 커밋 나무는 다음과 같이 만들 수 있습니다 :

+----+ +----+     +----+ 
| A1 |->| A2 |---------------->| A5 | 
+----+ +----+     +----+ 
      \ +----+ +----+ /
      \->| B3 |->| B4 |--/ 
       +----+ +----+ 

답변

2
처음으로 당신이 할 수있는

git checkout B4 다음 git rebase --interactive A2을. $EDITORpick <ABREVIATTED-HASH> <COMMIT-MESSAGE>으로 형식화 된 많은 커밋이 나열된 파일로 실행됩니다. 마지막 파일을 제외한 모든 파일을 제거하십시오 (B3B4이어야 함). 그런 다음 해당 파일을 저장하고 $EDITOR을 닫고 git은 선택한 커밋을 A2 위에 적용합니다. git이 충돌을 감지하면 프롬프트가 표시되고 해결 방법을 묻습니다. 충돌을 편집하고 git add 충돌 파일 및 git rebase --continue을 수정하십시오. 모든 충돌을 해결할 때까지 이렇게하십시오. 그 후에는 B3B4A2 위에 적용됩니다. git checkout A5, git merge B4 그리고 원하는 트리가 생성됩니다. 당신의 예에서와 같이 단 2 커밋이있는 경우

, 그냥 이렇게 쉽게 될 수 있습니다

구멍 rebase 노래가 무엇을 할 것입니다
$ git checkout A2 
$ git cherry-pick B3 
$ git cherry-pick B4 
$ git checkout A5 
$ git merge B4 

. 커밋이 많으면 시간이 많이 걸릴 것입니다. 당신이 선택하십시오 :

관련 문제