2013-07-13 1 views
1

나는 비교적 오래된 브랜치를 마스터에 병합했고 병합 결과는 신랄한 혼란이었다. 어떤 git merge를 실행했을 때 알 수없는 몇 가지 이유 때문에 자동으로 다른 분기에서 업데이트되어 master로 병합 된 날짜가 지난 코드를 자동으로 가져 왔습니다.git에서 수동으로 분기를 병합하려면 어떻게해야합니까?

이 이전 분기는 자동으로 인한 혼란을 정리하는 것보다 훨씬 쉽게 내가 원하는 그래서

git difftool oldbranch 

같은 일을 수동으로 시각적 difftool로 변경을 통해 복사 만 몇 가지 변경이 있습니다 병합하십시오.

이 방법의 문제점은 분기가 병합되었음을 보여주지 않기 때문에 내 기록/네트워크/트리를 망칠 수 있다는 것입니다.

질문은 자동 병합 (바람직하게는 그래픽 비교/병합 도구 사용)없이 의존적으로 분기를 수동으로 병합하는 방법입니까?

답변

2

이 이전 분기 내가 난장판을 청소보다 훨씬 쉽게 원하는 등

git difftool oldbranch

같은 일을 수동으로 시각적 difftool로 변경을 통해 복사 만 몇 가지 변경이 있습니다 자동 병합으로 인해 발생합니다.

이 분기가 오래 만 그 방법 업데이트 된 지점에 병합 master에 변경 내용을 리베이스하려는 당신이 대신 할 수있는 당신이 원하는 몇 가지 변화를 가지고 있기 때문에.

그러나 이전 분기에서 어떻게 든 원하지 않는 이전 변경 사항을 가져 왔다고 언급 했으므로 리베이스하는 것에 대해 좀 더 자세히 살펴 보겠습니다.

실제로 원하는 모든 변경 사항은 이전 분기의 끝에있는 원자 커밋에 있다고 가정합니다.이 분기는 지점 old이라고합니다.

I   J   master 
o---------o----------o 
      \ 
      \ 
      o K 
       \ 
       \ 
       o L 
       \ 
        \ 
        o old 

이의 당신이 masterold을 통해 커밋을 L을 병합 할 것을 가정 해 봅시다, 어떻게 든 J 나쁜 이미 master에서 수정되었습니다하지만 어떻게 든 사용자들은 커밋한다 : 그래서 old의 역사는이 같은 작은 선물을 볼 것이다 당신은 또한 K는 "나쁜"또한 당신이 master에 추가 할하지 않는 것이 커밋 가정의하자

# With master checked out 
git merge old 

을 실행할 때 여전히 통합된다.

# Make a new branch off current commit of master 
git branch new-branch master 

# Now rebase L through old onto new-branch 
git rebase --onto new-branch K old 

이 망할 놈의 사이의 커밋을하는 것입니다 말해 무엇 :

그런 다음 당신이 할 수있는 일 현재 오프 새로운 지점 새로운 지점에 old을 통해 범 L을 리베이스 선택적으로 master의 커밋 할 것입니다 Kold과 같이 다른 샤시로 복사하고 new-branch의 끝 부분에 복사하십시오 ((K, old]과 유사 할 것입니다). 범위의 배타적 인 끝이기 때문에 K을 빼십시오.

그래서 지금 가지는 다음과 같다 :

이제
I   J   master 
o---------o----------o 
      \   \ 
      \   \ 
      o K  o L` 
       \   \ 
       \   \ 
       o L  o new-branch (same commit as where old branch was at) 
       \ 
        \ 
        o old 

당신이-빨리 감기 또는 비 빨리 감기 병합 중 하나를 사용하여 새 분기에 병합 할 수 있습니다 :

# From master branch, use fast-forward merge 
git merge new-branch 

# Or force a merge-commit with non-fast-forward 
git merge --no-ff new-branch 

대신을 rebase를 사용하면 cherry-pick을 사용하여 new-branch에 추가하는 커밋을 매우 선택적으로 처리 할 수 ​​있으므로 커밋 범위와 단일 커밋을 모두 선택할 수 있으므로보다 세부적인 제어가 가능합니다.

1

당신이 정말이 길을 갈하려는 경우, 수동으로 병합 한 다음 합병으로 지점을 표시합니다

git merge -s ours oldbranch 

,하지만 마스터에 대한 변경 사항을 적용 할 수 있습니다.

+0

작동하는 것처럼 보이지만 너무 더러워 보입니다. –