3

문제가 있습니다. 지점이 masterfeature이었습니다. 1 백 년 전 masterfeature은 공통 조상을 가졌지 만, 그 이후로 100500 커밋이 통과되었습니다. masterfeature 브랜치가 이제 매우 다양합니다. 승인. 나는 하루 종일 보냈고 마침내이 % # $ % # 병합을 완료했습니다. 하지만 ... 하루가 끝날 무렵이 결과를 보관소로 보내고 팀원이 'master'지점에서 약 5 개의 새로운 커밋을 작성했다는 사실을 알게되었습니다. $ # % # $ 우리에게 중요합니다 해야 할 일 rebase 앞으로 내 병합을 빨리 감기하려면이 커밋을 수행하십시오. 따라서이 5 가지 커밋을 내 병합 결과에 통합해야합니다. 이미 E 내 로컬 repo에서 masterfeature에 병합 한 결과로 커밋 (구성표를보세요)했습니다. 나는 C1 때문에 서버에 그것을 밀어 넣을 수 없다 ... C5 - 리모컨에 새로운 커밋이 feature에있다. 내가 리모컨에서 새로운 것을 만들었을 때 나는 이미 표준 변경을했는데, 하나의 브랜치의 히스토리를 유지하려면 git pull --rebase을 수행한다. 나는 git pull --rebase을 돌 렸으며 실제로 모두 다시 합치려면 git에서 제안을 얻었다. C1에서 손대지 않은 파일에도 많은 충돌이 있습니다 ... C5가 커밋합니다. 내가 뭘 잘못하고있어? 도와주세요. 내가 두 번째 계획에 익사 한 결과를 얻는 방법? 내가 미쳤 니? 전혀 할 수 있습니까?병합 - 커밋 빨리 감기 필요에 의해 복잡한 두 개의 서로 다른 분기를 병합 수행

Now: 

o--A--o-----...100500 commits....[master]....--o-----------B 
     \             \ 
     o---...100500 commits....[feature - local repo]...C--E(local repo - epic merge result) 
     |          
     o---...100500 commits....[feature - remote repo]..C--C1--C2--C3--C4--C5(remote repo, feature branch - additional 5 commits) 


Need to fast-forward E ahead C1, C2,... C5, that were added on remote when I was busy with merge: 

o--A--o-----...100500 commits....[master]....--o-----------------------B 
     \                \ 
     o---...100500 commits....[feature]...--o--C--C1--C2--C3--C4--C5--E(epic merge result) 

업데이트
내가 git pull --rebase 내가 그 자식은 C1의 상단에 넣어하려고 나타났습니다 (feature 분기에 체류)하고있어, ..., C5는 첫 번째 (feature 지점의 원격에 커밋) , 그 다음에 두 번째, 그리고 master 브랜치의 다른 100500 커밋. 그것은 내가 원하는 것이 아닙니다. 난 단지 E C1 꼭대기에 커밋이 필요합니다 .. C5,하지만 모두 master 지점의 커밋. 이 동작을 보면 에서 git rebase --continue 사이에 충돌이 발생하여 git mergetool 사이클이 발생합니다.

답변

0

병합을 사용하여 내역을 확인하고 그 위에 5 개의 커밋을 리베이스하십시오. 네, 이것은 당신이 요구 한 것이 아니라 인내심을 가지고 있습니다.

발생하는 병합 충돌을 해결하십시오. 5 가지 커밋 만 처리하기 때문에 이것은 간단해야합니다.

이제 원하는 결과 트리가 생겼습니다. 여기에 태그를 버리고 모든 것을 버리고 다시 시작하십시오.

새로 병합을 수행하십시오. 이번에는 병합중인 분기에 5 개의 새로운 커밋을 포함하십시오. 그러나 실제로 커밋을 수행하지 않으려면 -s ours을 전략 옵션으로 지정하고 --no-commit을 전달하십시오.

이제 이전 병합 + 리베이스에서 트리를 읽으십시오. 이것은 git checkout $tag -- .과 같이 간단해야합니다 (이전 결과에 배치 한 태그는 $tag입니다).

이제 git commit을 실행하십시오. 이렇게하면 원하는 역사와 이전 작업으로 생성 된 트리가 병합됩니다.

이 모양이 좋으면 태그를 누르고 삭제하십시오.

+0

미안하지만 바보입니다. 자세한 내용을 설명해주세요. "병합을 사용하여 내역을 확인하고 그 위에 5 개의 새로운 커밋을 리베이스하십시오"는 의미입니다. 내가 중단 한 리베이스 중에 병합을 처리한다는 의미입니까? (지옥입니다!) – Dao

+0

@Dao : 현재 기록을 보면 마스터가 있고 로컬 기능이 병합되어 있습니다.당신은 그 위에 원격 기능을 리베이스하려고합니다. 가장 간단한 방법은 실제로 모든 5 가지 커밋 중에서 체리 선택 일 수 있습니다 ('git cherry-pick ..remote/feature'). –

+0

@Dao : 로컬 지사 지점을 체크 아웃하고 리모컨과 일치하도록 업데이트 한 다음'git rebase master' 만 할 수 있습니다. –