git에서 하위 디렉토리를 어떻게 병합합니까?
로컬 git 브랜치에서 원격 git 브랜치로 하위 디렉토리의 변경 사항 만 병합 할 수 있습니까? 아니면 "모두 또는 아무것도"입니까?
예를 들면 다음과 같습니다.
branch-a
- content-1
- dir-1
- content-2
과
branch-b
- content-1
- dir-1
- `content-2
branch-a dir-1의 내용과 branch-b dir-1의 내용 만 병합하고 싶습니다.
" 선택 파일을 git-merge와 어떻게 병합합니까? "라는 질문에 대한 대안으로 방금 git read-tree를 기반으로 전체 하위 디렉토리를 병합하는 데 더 적합 할 수있는 이 GitHub 스레드 를 찾았 습니다 .
내 저장소 =>
cookbooks
내 저장소 대상 디렉토리 =>cookbooks/cassandra
원격 저장소 =>
infochimps
병합하려는 원격 저장소 소스cookbooks/cassandra
=>infochimps/cookbooks/cassandra
병합하는 데 사용한 명령은 다음과 같습니다.
- 저장소를 추가하고 가져옵니다.
git remote add -f infochimps git : //github.com/infochimps/cluster_chef.git
- 병합 수행
git merge -s ours --no-commit infochimps / master
- 만 병합
infochimps/cookbooks/cassandra
으로cassandra
git read-tree --prefix = cassandra / -u infochimps / master : cookbooks / cassandra
- 변경 커밋
git commit -m 'merging in infochimps cassandra'
추가
기이합니다. [편집] — read-tree
단계는 다음과 같이 실패 할 수 있습니다.
error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.
... 두 파일이 동일한 경우에도 . 도움이 될 수 있습니다.
git rm -r cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
그러나 물론, 이것이 원하는 것을 수동으로 확인하십시오.
내 예를 들어, 자신의 업스트림 버전을 반영하고 (로컬 전용 인 경우에는 아님) 최신 코드로 가져 오는 분기 '소스'및 분기 '대상'이 있다고 가정합니다. 'source'브랜치에만 존재하는 newFeature라는 저장소의 하위 디렉토리를 원한다고 가정 해 보겠습니다.
git checkout destination
git checkout source newFeature/
git commit -am "Merged the new feature from source to destination branch."
git pull --rebase
git push
내가 본 다른 모든 것보다 훨씬 덜 복잡하며 이것은 여기 에서 찾을 수 있습니다 .
이것은 '실제 병합'이 아니므로 대상 브랜치에 newFeature에 대한 커밋 정보가없고 해당 하위 디렉터리의 파일에 대한 수정 사항 만 있습니다. 그러나 아마도 나중에 전체 분기를 병합하거나 폐기 할 것이기 때문에 문제가되지 않을 수 있습니다.
Eclipse 의 포럼 스레드 에서 이것을 얻었 으며 매력처럼 작동했습니다.
git checkout source-branch
git checkout target-branch <directories-or-files-you-do-**NOT**-want>
git commit
git checkout target-branch
git merge source-branch
create git repo에는 branch-a와 branch-b가 모두 포함됩니다.
git checkout branch-a
git diff branch-b dir-1 > a.diff
patch -R -p1 < a.diff
git cherry-pick
원하는 커밋을 선택하고 이러한 커밋 만 병합하는 데 사용 합니다. 여기서 핵심 트릭은 이러한 커밋을 쉬운 방법으로 가져 오는 것입니다 (따라서 수동으로 git 로그를 확인하고 직접 입력하여 확인할 필요가 없습니다). 방법은 다음과 같습니다. 다음과 git log
같이 커밋의 sha1 ID를 인쇄하는 데 사용 합니다.
git log ^<commit-a> <commit-b> --pretty=format:"%h" --reverse -- <subdir>
commit-a는 병합 할 분기의 시작 지점 직전의 커밋이고 commit-b는 병합 할 분기의 마지막 커밋입니다. --reverse는 나중에 체리 선택을 위해 이러한 커밋을 역순으로 인쇄합니다.
그런 다음 다음과 같이하십시오.
git cherry-pick $(git log ^<commit-a> <commit-b> --pretty=format:"%h" --reverse -- <subdir>)
간단하고 안정적인 두 단계!
참고 URL : https://stackoverflow.com/questions/1214906/how-do-i-merge-a-sub-directory-in-git
'Development Tip' 카테고리의 다른 글
약한 참조 이점 (0) | 2020.10.24 |
---|---|
Django 1.3 이하의 Django Admin에서 사용자 지정 필터 (0) | 2020.10.24 |
SQL Server에서 날짜 + 시간에서 날짜를 얻는 가장 효율적인 방법은 무엇입니까? (0) | 2020.10.23 |
문자열에서 N 번째 문자 찾기 (0) | 2020.10.23 |
Mercurial (hg)의 저장소에있는 모든 파일을 나열하는 방법은 무엇입니까? (0) | 2020.10.23 |