2013-07-10 4 views
1

git에서 여러 분기 간의 변경 집합을 나눌 수있는 "최선"("가장 쉽다", "선호하는", "적절한") 방법은 무엇입니까? 예를 들어 브랜치 X에서 작업하는 동안 커밋되지 않은 변경 사항 집합을 만들었지 만 변경 사항 중 일부는 실제로 브랜치 Y에 커밋되어야하고 다른 항목은 브랜치 Z에 커밋되어야하고 다른 항목은 브랜치 W에 커밋되어야합니다. 일반적으로 내가 본능적으로 (예 : here과 같이)하는 것은 변경 사항을 숨기고, Y를 체크 아웃하고, 변경 사항을 적용하고, Y와 관련이있는 항목 만 커밋하고, 다른 분기에 대해 반복하는 것입니다. 이 문제는 내가 처리 한 변경 사항을 병합 처리하면 종종 처리해야하는 병합 충돌이 발생하고 적용 대신에 숨김 팝업을 사용하면 (나에게 실질적인 위험이 될만큼 자주 발생합니다!) 결국 Y 지점에서 Z를위한 변경 사항을 혼돈에 빠뜨리므로 수동으로 풀어야합니다.git에서 여러 분기간에 변경 사항을 어떻게 나누는가?

더 좋은 방법이 있습니까? 이 상황을 얼마나 잘 처리 할 수 ​​있을까요?

내 질문은 this one과 같은 질문과 관련되어 있지만 여러 가지 분기에서 현재 변경 사항 집합을 나누는 최선의 방법을 찾고 있다는 점에 유의하십시오. 또한 변경 세트를 개발하기 전에 Y, Z 또는 W로 전환 할 수 없습니다. 나는 X에서 시작하여 X에 일련의 변경을 개발해야한다.

+0

* "또한 나는 Y, Z 또는 W 이전의 설정이 변경 개발로 전환 할 수 있습니다, 나는 X에 시작하고 X의 변경 세트를 개발해야 "* : 변경 사항이 모두 관련있는 것처럼 들립니다. 그렇다면 다른 지점에 변경 사항을 적용 할 때 다른 지점에 맡기는 방법은 무엇입니까? –

+0

@DanielHilgarth, 변경 사항은 관련되어 있지만 다른 분기에서 커밋하고 싶은 이유는 분기 Y, Z 및 W를 사용하는 다른 사용자도 이러한 개선점을 사용할 수 있기 때문입니다. 변경 사항 중 일부는 논리적으로 분기 Y, Z 및 W에 속하므로 이러한 개선을 원하는 사람들은 해당 분기에서 해당 변경 사항을 병합 할 수 있습니다. – BlueBomber

+0

그러면 왜 해당 변경 사항을 각 지점에서 직접 개발할 수 없습니까? 여기에 당신의 시나리오를 이해하려고 노력 중입니다 ... –

답변

1

git stash와 여러 가지 브랜치의 문제점은 일단 갑자기 튀어 나면 다음 브랜치를 다시 숨겨야한다는 것이다. 이 문제를 해결하려면 임시 분기를 사용하는 것만으로도 충분합니다.

git checkout -b temp_branch 
git commit -a -m 'Changes that will go to several branches.' 
git checkout W 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for W.' 
git checkout X 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for X.' 
git checkout Y 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for Y.' 
git checkout Z 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for Z.' 
git branch -D temp_branch 
+0

이것은 stashing과 동등한 것으로서, 각 브랜치에 stash를 적용하고 변경 사항을 선별 적으로 적용하는 것과 같습니다. 내가 놓친 게 있니? – BlueBomber

+0

이 단계는 병합 충돌을 해결하는 데 도움이되지 않습니다.이것은 내가 이런 상황에서 당신을 위해 뭔가를 시도하는 것을 원하지 않기 때문에 피할 수없는 것이라고 생각합니다. – cforbish

1

원래 분기에서 여러 커밋을 수행 한 다음 대상 분기에서 체리를 선택하고 마지막으로 변경 내용을 롤백하는 방법이 있습니다.

과 같이 :

git add -i 
git commit -m 'changes for X' 
git add -i 
git commit -m 'changes for Y' 
git log -n 2 # to see hashes 
git checkout X 
git cherry-pick <hash of the first commit> 
git checkout Y 
git cherry-pick <hash of the second commit> 
git checkout original_branch 
git reset --hard HEAD~2