programing

특정 파일("우리", "내", "그들의")에 대한 Git 병합 전략을 선택합니다.

goodsources 2023. 5. 1. 21:01
반응형

특정 파일("우리", "내", "그들의")에 대한 Git 병합 전략을 선택합니다.

잠시 후에 리베이스를 하는 중입니다.git pull --rebase병합 충돌이 있는 파일이 몇 개 있습니다.특정 파일에 대한 "그들" 변경사항 또는 "내" 변경사항을 수락하려면 어떻게 해야 합니까?

$ git status
# Not currently on any branch.
# You are currently rebasing.
#   (fix conflicts and then run "git rebase --continue")
#   (use "git rebase --skip" to skip this patch)
#   (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:  CorrectlyMergedFile
#
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add <file>..." to mark resolution)
#
#       both modified: FileWhereIWantToAcceptTheirChanges
#       both modified: FileWhereIWantToAcceptMyChanges

일반적으로 저는 파일이나 병합 도구를 열고 모든 "그들" 또는 "내" 변경사항을 수동으로 수락합니다.하지만 편리한 git 명령어가 누락된 것 같습니다.

또한 충돌이 발생한 파일과 충돌이 발생한 경우에만 각 파일에 대한 병합 전략을 선택할 수 있습니다.

충돌하는 각 파일에 대해 다음을 지정할 수 있습니다.

git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>

문서에서

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
때 stage 2stage #2)ours) 또는 #3(theirs병합되지 않은 경로의 경우.

이전에 병합에 실패했기 때문에 인덱스에 병합되지 않은 항목이 포함되어 있을 수 있습니다.기본적으로 인덱스에서 이러한 항목을 체크아웃하려고 하면 체크아웃 작업이 실패하고 아무것도 체크아웃되지 않습니다.용사를 합니다.-f병합되지 않은 항목은 무시됩니다.은 다음을사여병특측정 내 인 있 수 에 체 서 니 다 습 할 웃 아 크 스 덱 을 용 용 하 의 합 ▁by ▁using 니 ▁the 다 ▁index ▁be 있 습 ▁can ▁out ▁of ▁the ▁side ▁of ▁contents ▁from ▁checked ▁specific ▁merge--ours또는--theirs.와 함께-m작업 트리 파일의 변경 내용을 삭제하여 원래의 충돌된 병합 결과를 다시 만들 수 있습니다.

이 질문에 답하더라도 깃베이스 대 병합의 경우 "그들의 것"과 "우리의 것"이 무엇을 의미하는지에 대한 예를 제공합니다. 링크 보기


theirsrebase의 경우에는 실제로 현재 분기입니다.따라서 아래 명령 집합은 실제로 원격 분기를 통해 현재 분기 변경사항을 수락합니다.

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Merge
병합의 경우, 다음과 같습니다.theirs그리고.ours반대입니다.따라서 병합 중에도 동일한 효과를 얻으려면, 즉 현재 분기 변경 사항을 유지합니다.ours에 있습니다. (으(으)로 표시됩니다.theirs).

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b

:git checkout --ours|--theirs다음 중 하나를 선택하여 파일을 완전히 덮어씁니다.theirs또는ours원하는 버전일 수도 있고 아닐 수도 있습니다(다른 쪽에서 수정되지 않은 변경사항이 있는 경우 해당 변경사항은 손실됩니다).

대신 파일에 대해 3방향 병합을 수행하고 다음을 사용하여 충돌된 헝크만 해결하려면--ours|--theirs양쪽의 비굴한 허크를 제자리에 유지하면서, 당신은 아마도 의지하고 싶을 것입니다.git merge-file자세한 내용은 이 답변을 참조하십시오.

위의 의견에서 @user456814를 인용합니다.

git rebase -s recursive -X <ours/theirs>
또는
git merge -s recursive -X <ours/theirs>

기본 재배치의 경우 "우리"와 "그들"은 병합 중에 원래 상태와 반대됩니다.

@user456814는 2014년에 승인된 답변에 대한 코멘트에서 이 유용한 답변을 했습니다.그런 면에서 댓글이 제한되어 있기 때문에 쉽게 찾고, 평가하고, 업데이트하는 등의 작업을 하기 위해 커뮤니티 위키로 표면화하고 있습니다.

언급URL : https://stackoverflow.com/questions/16825849/choose-git-merge-strategy-for-specific-files-ours-mine-theirs

반응형