Git 브랜치에서 특정 파일을 병합하는 방법


179

git 브랜치 branch1과 branch2가 2 개 있으며 branch2의 file.py를 branch1의 file.py에 병합하고 싶습니다.

본질적으로 나는 branch1의 file.py에 대해 작업하고 싶지만 merge 명령을 이용하고 싶습니다. 가장 좋은 방법은 무엇입니까?



답변:


207

컨텐츠가 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 명령이 특히 유용합니다.


3
패치를 어떻게 사용하고 동시에 병합 도구를 사용할 수 있습니까? 주요 내용 대신
Gabriel

@Gabriel 패치 파일 및 tarball과 함께도 Git을 사용했습니다. repo ( git init <dir>) 를 생성하고 버리기 ( rm -r <dir>) 기 쉽기 때문 입니다.
pdp

105

아닌 있지만 병합 자체로, 때로는 다른 분기에 다른 파일의 전체 내용이 필요하다. Jason Rudolph의 블로그 게시물 은 한 지점에서 다른 지점으로 파일을 복사하는 간단한 방법을 제공합니다. 다음과 같이 기술을 적용하십시오.

$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py

지금은 file.py지금이다 BRANCH1 .


91
쉽지만 실제로는 병합 이 아닙니다 . 그것은 단지 file.py분기 2에있는 모든 것을 덮어 씁니다 .
Greg Hewgill

파일을 branch1에서 branch2로 다시 병합하면 어떻게 되나요? 갈등이 생길 것입니다!
Amir

커밋 히스토리가 유지됩니까?
C2H50H

18

다른 현재 답변은 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

15

모든 수정 사항이 있습니까 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

8

당신 stashstash pop파일 :

git checkout branch1
git checkout branch2 file.py
git stash
git checkout branch1
git stash pop

이렇게하면 병합 충돌이 발생하여 해결해야하는 병합 대신 branch2 / file.py의 내용으로 branch1 / file.py를 덮어 씁니다.
plumSemPy

2

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"

0

나는 같은 상황에 있고, 2 개의 분기에 많은 커밋이있는 지점에서 파일을 병합하려고합니다. 나는 위의 많은 방법과 인터넷에서 찾은 다른 방법을 시도했지만 모두 실패했습니다 (커밋 기록이 복잡하기 때문에).

git merge <other-branch>
cp file-to-merge file-to-merge.example
git reset --hard HEAD (or HEAD^1 if no conflicts happen)
cp file-to-merge.example file-to-merge

0

내가 한 일은 약간 수동이지만, 나는 :

  1. 가지를 정상적으로 합병; revert; 와의 병합을 되돌 렸습니다 .
  2. 내 모든 파일을 HEAD~1(즉, 병합 커밋에서 파일 의 상태를 확인했습니다.)
  3. 커밋 기록에서이 해커를 숨기려는 커밋을 다시 작성했습니다.

추한? 예. 기억하기 쉬운가? 또한 그렇습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.