git 브랜치 branch1과 branch2가 2 개 있으며 branch2의 file.py를 branch1의 file.py에 병합하고 싶습니다.
본질적으로 나는 branch1의 file.py에 대해 작업하고 싶지만 merge 명령을 이용하고 싶습니다. 가장 좋은 방법은 무엇입니까?
git 브랜치 branch1과 branch2가 2 개 있으며 branch2의 file.py를 branch1의 file.py에 병합하고 싶습니다.
본질적으로 나는 branch1의 file.py에 대해 작업하고 싶지만 merge 명령을 이용하고 싶습니다. 가장 좋은 방법은 무엇입니까?
답변:
컨텐츠가 branch1file.py
에서 더 이상 branch1에 적용되지 않는 경우 일부 변경 사항을 선택하고 다른 변경 사항 을 남겨야 합니다. 완전한 제어를 위해 스위치를 사용하여 대화식 병합을 수행하십시오 .--patch
$ git checkout --patch branch2 file.py
매뉴얼 페이지의 대화식 모드 섹션에서 git-add(1)
사용할 키 에 대해 설명합니다.
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
split 명령이 특히 유용합니다.
git init <dir>
) 를 생성하고 버리기 ( rm -r <dir>
) 기 쉽기 때문 입니다.
아닌 있지만 병합 자체로, 때로는 다른 분기에 다른 파일의 전체 내용이 필요하다. Jason Rudolph의 블로그 게시물 은 한 지점에서 다른 지점으로 파일을 복사하는 간단한 방법을 제공합니다. 다음과 같이 기술을 적용하십시오.
$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py
지금은 file.py
지금이다 BRANCH1 .
file.py
분기 2에있는 모든 것을 덮어 씁니다 .
다른 현재 답변은 merge 명령을 사용하는 것처럼 실제로 파일을 "병합"하지 않습니다. (최상의 경우 수동으로 diff를 선택해야합니다.) 실제로 공통 조상의 정보를 사용하여 병합을 활용하려면 git 의 "Advanced Merging"섹션 에 있는 절차를 따르십시오. 참조 매뉴얼.
이 프로토콜의 경우 'path / to / file.txt'파일을 origin / master에서 HEAD로 병합하고 싶다고 가정합니다. 적절하게 수정하십시오. (저장소의 최상위 디렉토리에있을 필요는 없지만 도움이됩니다.)
# Find the merge base SHA1 (the common ancestor) for the two commits:
git merge-base HEAD origin/master
# Get the contents of the files at each stage
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show HEAD:path/to/file.txt > ./file.ours.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
# You can pre-edit any of the files (e.g. run a formatter on it), if you want.
# Merge the files
git merge-file -p ./file.ours.txt ./file.common.txt ./file.theirs.txt > ./file.merged.txt
# Resolve merge conflicts in ./file.merged.txt
# Copy the merged version to the destination
# Clean up the intermediate files
git merge-file 은 포맷팅 등을 위해 모든 기본 병합 설정을 사용해야합니다.
또한 "우리의"버전이 작업 사본 버전이고 지나치게 신중하지 않으려는 경우 파일에서 직접 작업 할 수 있습니다.
git merge-base HEAD origin/master
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
git merge-file path/to/file.txt ./file.common.txt ./file.theirs.txt
모든 수정 사항이 있습니까 file.py
에서 branch2
자신의 커밋에서 다른 파일에 대한 수정과 분리? 그렇다면 간단히 다음과 cherry-pick
같이 변경하면됩니다.
git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>
그렇지 않으면, merge
당신은뿐만 아니라 단지 만들 수 있습니다 ... 이상 개별 경로를 작동하지 않는 경우 git diff
의 패치 file.py
에서 변화 branch2
하고 git apply
그들에게를 branch1
:
git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch
branch2의 변경 사항 만 병합하려면 file.py
다른 변경 사항을 제거하십시오.
git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip
병합은 다른 파일도 보지 않습니다. 나무가 충분히 다른 경우 체크 아웃을 '-f'해야 할 수도 있습니다.
이것은 branch1의 히스토리에있는 모든 것이 그 시점까지 병합 된 것처럼 보이는데, 이는 원하는 것이 아닐 수도 있습니다. 위의 첫 번째 체크 아웃의 더 나은 버전은 아마도
git checkout -B wip `git merge-base branch1 branch2`
이 경우 커밋 메시지는 아마도
git commit -m"merging only $(git rev-parse branch2):file.py into branch1"