programing

Git 분기에서 특정 파일을 병합하는 방법

firstcheck 2023. 5. 13. 21:04
반응형

Git 분기에서 특정 파일을 병합하는 방법

나는 2개의 깃 가지가 있습니다.

  1. 지점1
  2. 지점2

branch2 모든 이력(복수 커밋)을 다음으로 병합합니다.file.py1번 지점에 있고 그 파일만 있습니다.

본질적으로 저는 단지 작업을 하고 싶습니다.file.pybranch1에서 그러나 그것을 이용하기를 원합니다.merge지휘권

이것을 하는 가장 좋은 방법은 무엇입니까?

이 내이다있을때에 때.file.py이상 branch1에 적용되지 않는 branch2에서 일부 변경 사항을 선택하고 다른 변경 사항은 남겨 두어야 합니다.전체 제어를 위해 다음을 사용하여 대화형 병합을 수행합니다.--patch스위치:

$ git checkout --patch branch2 file.py

페이지의 man 은 interactive mode 입니다.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 명령어는 특히 유용합니다.

병합 자체는 아니지만 다른 분기에 있는 다른 파일의 전체 내용이 필요한 경우도 있습니다.Jason Rudolph의 블로그 게시물은 한 지점에서 다른 지점으로 파일을 복사하는 간단한 방법을 제공합니다.다음과 같이 매개 변수를 적용합니다.

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

지금이다file.py이제 1지점에 있습니다.

병합 명령을 사용하는 것처럼 파일을 실제로 " 병합"하는 현재 응답은 없습니다. (최적의 경우 수동으로 diff를 선택해야 합니다.)공통 상위 항목의 정보를 사용하여 병합을 실제로 활용하려는 경우 Git Reference Manual의 "Advanced Marge" 섹션에 있는 정보를 기반으로 한 절차를 수행할 수 있습니다.

이 프로토콜의 경우 'path/to/file' 파일을 병합하려고 합니다.txt'는 오리진/마스터에서 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은 포맷 등을 위해 모든 기본 merge 설정을 사용해야 합니다.

또한 "당사"가 작업 복사본 버전이고 지나치게 주의하지 않으려는 경우 파일에서 직접 작업할 수 있습니다.

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.pybranch2다른 파일에 대한 수정 사항과 별개로, 그들 자신의 커밋에서?그렇다면 간단하게cherry-pick변경 내용:

git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>

않으면, 않면으지그.merge개별 경로에서 작동하지 않습니다...당신은 그냥 만드는 것이 나을 수도 있습니다.git difffile.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

내가 찾은 해결책은 나에게 가장 적은 두통을 유발했습니다.

git checkout <b1>
git checkout -b dummy
git merge <b2>
git checkout <b1>
git checkout dummy <path to file>
git branch -D dummy

한 후에 그게한 파의일에 파일.path to fileb2와의 완전한 합병 후의 결과입니다.b1.

넌 할 수 있다.stash그리고.stash pop파일:

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

Git checkout은 이것에 대한 옵션을 제공합니다.

git checkout --merge branch2 file.py

이 옵션을 사용하면 충돌된 병합이 다시 생성됩니다.

그렇지 않으면 새 병합이 대신 발생해야 하는 경우:

# Detach and overwrite file.py with content from branch2 
git checkout --detach
git checkout branch2 file.py

# Amend changes and switch back
git commit --amend --no-edit
git checkout -

# Merge the detached branch back in
git merge --no-commit -

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이 branch2의 기록에 있는 모든 것이 해당 지점까지 병합된 것처럼 보일 수 있으며, 이는 사용자가 원하는 것이 아닐 수 있습니다.위의 첫 번째 체크아웃의 더 나은 버전은 아마도

git checkout -B wip `git merge-base branch1 branch2`

이 경우 커밋 메시지도 다음과 같아야 합니다.

git commit -m"merging only $(git rev-parse branch2):file.py into branch1"

Matthew Turner의 솔루션이 가장 쉽지만 branch1과 file의 이름이 같을 경우 오류가 발생합니다.이 경우 두 번째 줄을 다음으로 바꿉니다.

git checkout branch2 -- file.py

가장 간단한 솔루션은 다음과 같습니다.

git checkout 소스 브랜치의 이름과 현재 브랜치에 추가할 특정 파일의 경로를 확인합니다.

git checkout sourceBranchName pathToFile

충돌 해결에만 관심이 있고 커밋 기록을 유지하는 데 관심이 없는 경우 다음 방법이 적용됩니다.하고 싶다고 해보세요.a.py b.pyBRANCHA안으로BRANCHB첫째, 변경 사항이 있는지 확인합니다.BRANCHB커밋되거나 저장되어 있으며 추적되지 않은 파일이 없습니다.그러면:

git checkout BRANCHB
git merge BRANCHA
# 'Accept' all changes
git add .
# Clear staging area
git reset HEAD -- .
# Stash only the files you want to keep
git stash push a.py b.py
# Remove all other changes
git add .
git reset --hard
# Now, pull the changes
git stash pop

git에 충돌이 있다는 것을 인식하지 못합니다.a.py b.py병합 충돌 마커는 실제로 충돌이 발생한 경우에 존재합니다.VSCode와 같은 타사 병합 툴을 사용하면 충돌을 보다 편안하게 해결할 수 있습니다.

이를 수락할 경우 다음과 같이 사용할 수 있다는 것을 공유해야 합니다.

git difftool <branch> [-- <file>]

([]옵션을 의미합니다.)

에 대해 된 경우diff.tool병합도와 같은 합니다.meld그래픽 인터페이스를 사용하여 두 파일을 수동으로 병합할 수 있습니다.

한 가지 약점은 파일이 분기 중 하나에 없으면 파일을 복사하거나 제거할 수 없다는 것입니다.그런 경우에는, 우리는.

git difftool역사도 보존하지 않습니다.

저는 미래의 혼란을 피하기 위해 몇 가지 답변이 도움이 되지만 혼란스럽다고 생각합니다.저는 같은 혼란을 겪고 있는 사람들을 도우려고 노력하고 있습니다.

의 이름은 사용하지 않습니다.branch1그리고.branch2,그렇지만master(라이브 코드) 및hotfix/abc(에서 제외)master) 및 atesting분점.

다음에서 특정 파일을 병합합니다.testing로.hotfix/abc왜냐하면 직접 병합하기 때문입니다.master부터testing또는staging분기는 권장되지 않습니다.이를 위해 다음을 수행합니다.

  1. git checkout hotfix/abc
  2. git checkout --merge testing path/to/file1.php path/to/file2.js
  3. git add .
  4. git commit -m "Fixed specific issue"
  5. git push
  6. 이제 repo로 이동하여 다음에 대한 끌어오기 요청을 합니다.hotfix/abc로.master분점.만약 당신이 그것을 어떻게 하는지 모른다면, 저는 그것에 대한 작은 튜토리얼을 가지고 있습니다.그리고 일반적으로 이러한 가지와 깃이 어떻게 작동하는지 알고 싶다면, 이것을 보는 것을 추천합니다.<=20분 플레이리스트
  7. 제이검다니를 해 보세요.pull request와 함께master그리고.merge 할입니다.master안으로hotfix/abc그리고 저기서 갈등을 해결하세요. 다음 합니다.3-5에 뒤에7.

저는 또한 레퍼런스 튜토리얼의 도움을 받았습니다.

도움이 된다면 엄지손가락을 들어보세요.해피 코딩 :)

저도 같은 상황입니다. 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

제가 한 일은 약간 수동적이지만, 저는:

  1. 정상적으로 했습니다. 을 분를정병합했습다니로 . 병합을 되돌렸습니다.revert;
  2. 을 든모파체습니다했웃으로 체크아웃했습니다.HEAD~1커밋의 ; 병합커밋의상태.
  3. 커밋 기록에서 이 해커 행위를 숨기기로 한 나의 커밋을 되돌렸습니다.

못생겼다고요? 네. 기억하기 쉽다고요?또한 그렇습니다.

언급URL : https://stackoverflow.com/questions/18115411/how-to-merge-specific-files-from-git-branches

반응형