2014-12-05 2 views
0

Git repo에 두 개의 디렉토리가 있습니다. 두 디렉토리의 파일 업데이트 사이에 큰 커밋 (약 400 개)이 있습니다. 과 같은 커밋 내에서 디렉토리에 대한 변경 사항을 포함하는 것으로 알려져 있습니다.병합 할 때 커밋 된 변경 사항으로부터 디렉터리를 보호하려면 어떻게해야합니까?

에 대한 기능 브랜치의 커밋을 마스터 브랜치에 병합해야합니다.은 해당 디렉토리 중 하나 일 뿐이고, 다른 디렉토리의 파일은 그대로 둡니다. 이것은 우리가 마스터에게 적용되는 커밋의 절반 정도를 원하지 않는다는 것을 의미합니다.

이렇게하는 것이 바람직한 방법은 무엇입니까?

답변

0

개별 커밋을 병합 할 수는 없지만 git cherry-pick 개별적으로 마스터 분기에 커밋 할 수 있습니다. git log을 사용하여 master에서 원하는 커밋의 SHA1을 파악한 다음 git cherry-pick을 사용하여 적용합니다.

cherry-pick은 원래 커밋과 다른 새로운 커밋을 도입하므로 마스터와 피쳐 브랜치에 본질적으로 중복 커밋이 생기기 때문에 이상적인 솔루션은 아닙니다. 나는 cherry-pick을 사용하는 것을 피하려고 노력한다. 그것은 당신의 문제를 해결하는 것처럼 보이지만 조심스럽게 진행하십시오.

+0

내가 원래 체리 - 선택하지만 접근 방식 몇 가지 문제를 사용하는 계획 커밋의 거대한 수 있었고, 또한 단지에있는 방법을 모르고 기능 지부에만 적용된 커밋을 얻으십시오 – draca

+0

'git branch --contains '을 사용하여 커밋이 어느 분기에 있는지 확인할 수 있습니다. 그러나 나는 동의한다, 나는 많은 커밋들에 대해 체리 피클을 사용하고 싶지 않다. –

+0

그냥 디렉토리의 복사본을 만드는 것에 대한 생각 나는 그 위에 기능 지회를 병합 한 후 업데이트하고 복원하고 싶지는 않지만 ... " directoryname; git checkout directoryname"을 수행하여 무엇이든 얻을 수 있습니까? 우리는 실제로 취소 될 불필요한 델타를 추가하고 싶지 않습니다. – draca

0

msater..feature의 모든 변경 내용을 dir1에 병합하려는 경우 master. 병합베이스에서 병합 팁까지의 컨텐츠 차이에 대해서만 병합합니다. 어떻게 당신이 거기에 갔는지 상관하지 않습니다. 그래서, A는 그 병합 할 올바른 병합베이스와 내용 만 변경이 커밋합니다 당신이 원하는

git checkout -b feature-dir1-extract $(git merge-base master feature) 
git checkout feature -- dir1 
git commit -m "extracting dir1 changes from [email protected]$(git rev-parse feature)" 

이제 당신이있어 모든 변경 사항을, 그리고 당신은 그 병합 할 수 있습니다 :

git checkout master 
git merge feature-dir1-extract 

이 내용은 병합 된 콘텐츠를 똑바로 유지하기에 충분합니다. dir1 콘텐츠가 모두 feature 인 것으로 나타나고 master에 표시됩니다. 정확히 일치하는 병합 기준이있는 것입니다. (git log --graph 또는 gui 도구를 통해) 커밋 그래프를 읽는 사람들이 상기 동일한 콘텐츠가 현재로서는 두 가지에 있음을 단지 unremarked 사실보다는 가계를 통해 녹음을 병합 : 추출 지점의 이름과 역사가는 역사 자체를 저지 읽는 사람들 만 지금 재미있다,에 관계없이

git checkout feature 
git merge feature-dir1-extract # recording common content only, no changes 

하고, 병합 커밋에는 이름과 기록이 모두 기록됩니다. 의 이름을 광고해야 할 필요가 없습니다 모두에게 무의미한 궁금해 :

git branch -d feature-dir1-extract 
관련 문제