Git 분기에서 특정 파일을 병합하는 방법
나는 2개의 깃 가지가 있습니다.
- 지점1
- 지점2
branch2의 모든 이력(복수 커밋)을 다음으로 병합합니다.file.py
1번 지점에 있고 그 파일만 있습니다.
본질적으로 저는 단지 작업을 하고 싶습니다.file.py
branch1에서 그러나 그것을 이용하기를 원합니다.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.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
내가 찾은 해결책은 나에게 가장 적은 두통을 유발했습니다.
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 file
b2
와의 완전한 합병 후의 결과입니다.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.py
BRANCHA
안으로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
분기는 권장되지 않습니다.이를 위해 다음을 수행합니다.
git checkout hotfix/abc
git checkout --merge testing path/to/file1.php path/to/file2.js
git add .
git commit -m "Fixed specific issue"
git push
- 이제 repo로 이동하여 다음에 대한 끌어오기 요청을 합니다.
hotfix/abc
로.master
분점.만약 당신이 그것을 어떻게 하는지 모른다면, 저는 그것에 대한 작은 튜토리얼을 가지고 있습니다.그리고 일반적으로 이러한 가지와 깃이 어떻게 작동하는지 알고 싶다면, 이것을 보는 것을 추천합니다.<=
20분 플레이리스트 - 제이검다니를 해 보세요.
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
제가 한 일은 약간 수동적이지만, 저는:
- 정상적으로 했습니다. 을 분를정병합했습다니로 . 병합을 되돌렸습니다.
revert
; - 을 든모파체습니다했웃으로 체크아웃했습니다.
HEAD~1
커밋의 ; 병합커밋의상태. - 커밋 기록에서 이 해커 행위를 숨기기로 한 나의 커밋을 되돌렸습니다.
못생겼다고요? 네. 기억하기 쉽다고요?또한 그렇습니다.
언급URL : https://stackoverflow.com/questions/18115411/how-to-merge-specific-files-from-git-branches
'programing' 카테고리의 다른 글
MongoDB 텍스트 검색 및 여러 검색어 (0) | 2023.05.13 |
---|---|
"git export"(예: "svn export")를 합니까? (0) | 2023.05.13 |
vblLf, vbCrLf 및 vbCr 상수의 차이 (0) | 2023.05.13 |
데이터베이스와의 연결을 끊고 PostgreSQL의 기본 데이터베이스로 돌아가는 방법은 무엇입니까? (0) | 2023.05.13 |
Xcode 9 빠른 언어 버전(SWIFT_VERSION) (0) | 2023.05.13 |