2017-02-03 14 views
0

우리는 master으로 병합하는 지형지 물에 분기를 사용합니다. 또한 버전에 분기를 사용합니다. 그러나, 나는 (master에 병합 된) 특정 기능을 가지고 있으며 버전 브랜치에 들어갈 필요가있다. 이전에는 이것을 위해 cherry-pick을 사용 했었지만 (수동으로 한 번에 하나씩 커밋)이 기능에는 한 번에 하나씩 커밋 할 수있는 커밋 수가 너무 많습니다. 더 좋은 방법이 있습니까?다른 지점의 힘내 기능을 병합 하시겠습니까?

이 기능은 이미 master에 병합되었습니다. 분기가 더 이상 로컬에 존재하지 않습니다. 그러나, 나는 그것을 master에 병합 한 커밋을 가지고있다.

feature-branch (GitHub를 사용하고 있기 때문에)을 복원 할 수 있습니다. 그러나 버전 브랜치에서 git merge feature-branch을 실행하면이 기능과 관련이없는 모든 종류의 충돌이 발생합니다. git rebase feature-branch (version-branch에서)을 수행하면 동일한 문제가 발생합니다. 쉬운 부분은 다시 feature-branch을 받고있다

*--*--X--Y---------------* [master] 
    \  \   /
    \  *--*--*--*--A [formerly feature-branch] 
     \ 
     *--*--* [version-branch] 

;

+0

이것은 마스터로 병합되고 리모컨으로 푸시 되었습니까? 아니면 모두 로컬입니까? – castis

+0

내 업데이트보기 @castis –

답변

1

귀하의 역사는 다음과 같이 보일 수 있습니다

git checkout -b feature-branch A 

그러나, version-branch 경우 (위 그림과 같이), 당신은 git merge 직선 또는 git rebase 싶지 않아 않았다feature-branch 전에 master오프 지형 때문에 : 단지 해시 A을 커밋 할 알아낼 또한 XY을 가져올 것입니다. 대신, --onto REBASE 수행

git rebase --onto version-branch Y feature-branch 

가 쉽게 Y을 찾을 수 있도록하기를, 당신은 할 수 있습니다 :

git merge-base master feature-branch 

또는 전부를 하나의 명령 :

git rebase --onto version-branch $(git merge-base master feature-branch) feature-branch 

을 REBASE이 후 완료되면 평소와 같이 version-branch으로 병합 할 수 있습니다.


당신은 어떤이 REBASE 동안 병합 충돌을 얻을 경우 (또는 version-branch는 또는 feature-branch가했고, 당신은 여전히 ​​충돌을 받고 후 master을 분기하는 경우) 그 충돌을 의미하기 때문에, 당신은, 그들과 거래를해야합니다 feature-branch의 커밋과 version-branch의 커밋 사이에 있습니다.

+0

'git cherry-pick -m 1 '을 할 수 있습니까? 여기서'MC'는'master'에'feature-branch'를 가져 오는 merge-commit입니까? – frans

+0

@frans : 내 머리 꼭대기에서 잘 모르겠지만 노력하지 않아도됩니다. –

0

기능 분기가 마스터를 기반으로하고 이전 버전의 분기에 다른 기록 (체리 선택 커밋, 병합 등)이 있으므로 버전 분기에서 병합 충돌이 발생합니다. 현재 기능 분기에서 마스터를 기반으로하는 다른 병합되지 않은 기능에 대한 추가 커밋이있을 것입니다. 그래서 나는 그것이 많은 어려운 갈등 해결 작업이 될 것이라고 기대합니다.

리베이스 할 수 없다고 생각합니다. 버전 브랜치를 기능 브랜치의베이스로 rebase하면 버킷 픽업 병합과 버전 브랜치의 오래된 해결 된 충돌이 다시 적용되어 새로운 충돌이 발생합니다.

제 의견으로는 프로세스가 잘못되었습니다.이전 버전에 새 기능을 적용하려면 기능 분기가 가장 오래된 버전 분기를 기반으로해야합니다. 그렇지 않으면 마스터에만 병합되기 때문에 이전 버전에 포함되지 않은 새 기능의 코드를 변경할 수 있습니다.

버전 (분기점)에 대해 다른 저장소를 만들고 버전 관리에 분기를 사용하지 않는 것이 좋습니다. 그것은 유지하기가 더 쉬워집니다. 기능을 다른 버전에 적용하려면 기능을 완료 한 후 기능 분기의 대상 버전 저장소로 해당 기능을 푸시하십시오. 그런 다음 코드에서 필요한 변경을 수행하고 충돌 등을 해결하고 버전 repo의 마스터에게 병합 할 수 있습니다.

희망이 있습니다.