특정 파일에 대한 Git 병합 전략을 선택하십시오 (“우리”,“광산”,“그들의”)


207

나는 후 rebasing의 중간에 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 명령이 누락 된 것 같습니다.

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


@ AbeVoelker 나는 그것이 내 문제를 해결한다고 생각하지 않습니다. 특정 파일에 대한 병합 전략을 선택하고 싶습니다. 또한 내가 rebase에있을 때 어떤 병합 전략을 사용해야하는지 알고 충돌이 발생한 파일과 충돌이 무엇인지 확인합니다.
Steven Wexler

:이 질문은 더 일반적인 것으로 편집 stackoverflow.com/questions/278081/... . 어쩌면 우리는이 질문을 그 복제본으로 닫을 수 있습니까? 그게 적절합니까?

@TheShadow 그것은 나에게 합리적인 것 같습니다.
Steven Wexler

이진 파일 확인에 대한 부분을 취했기 때문에 다른 질문 의 제목을 내가 한 일로 변경하는 것이 적절한 지 확실 하지 않았습니다. 다른 질문을 이전 질문으로 복원 했으므로이 현재 질문은 여전히 ​​가치를 더합니다.

답변:


251

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

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

로부터 git checkout문서

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

--ours
--theirs
색인에서 경로를 체크 아웃 할 때 병합되지 않은 경로에 대해 2 단계 ( ours) 또는 3 단계 ( )를 확인하십시오 theirs.

이전에 실패한 병합으로 인해 색인에 병합되지 않은 항목이 포함될 수 있습니다. 기본적으로 색인에서 이러한 항목을 체크 아웃하려고하면 체크 아웃 조작이 실패하고 체크 아웃되지 않습니다. 를 사용 -f하면 병합되지 않은 항목이 무시됩니다. 병합의 특정 측면에서 내용물을 사용하여 인덱스의 체크 아웃 할 수있는 --ours--theirs. 을 사용 -m하면 작업 트리 파일에 대한 변경 내용을 무시하여 원래 충돌 된 병합 결과를 다시 만들 수 있습니다.


9
숨겨져있는 모든 파일에 대해 파일을 수락 할 수 있습니까?
aslakjo

41
@aslakjo git rebase -s recursive -X <ours/theirs>또는 git merge -s recursive -X <ours/theirs>. 리베이스의 경우 "우리"와 "그들의"는 병합하는 동안의 것과 반대입니다. 아마도 파일 / 쉘 글로브를 사용할 수도 있습니다 git checkout --theirs -- *.txt.

2
@Cupcake, 감사합니다. ours/theirsrebase와의 예기치 않은 반전이 나를 미치게했습니다! (내가 전부는 아니지만 직관적에서, REBASE이 실제로 어떻게 작동하는지에 대해 생각 이니까 의미가 있습니다.)
댄 렌스키

2
@DanLenski rebase는 일반적으로 사람들이 처음에는 이해하기 어려운 도구이지만, 작동 방식을 이해하면 모든 종류의 강력한 작업을 수행 할 수 있습니다.

1
@VincentSels 실제로 * 문자를 마스크해야합니다. 그렇지 않으면 쉘이 확장하려고합니다. 그래서 당신의 경우에 git checkout --outs -- "**/*.csproj"당신이 의미하는 것을 할 것입니다. 예를 들어 마찬가지입니다 git lfs track "*.jpg". CWD에 따옴표가없는 jpg 파일이 있으면이 파일 만 추적됩니다.
eFloh

117

이 질문에 대한 답이 있더라도 git rebase vs merge의 경우 "그들"과 "우리"가 무엇을 의미하는지에 대한 예를 제공하십시오. 참조 링크를

Git Rebase
theirs 는 실제로 rebase 의 경우 현재 분기입니다 . 따라서 아래 명령 세트는 실제로 원격 분기를 통해 현재 분기 변경 사항을 수락합니다.

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

힘내 병합
의 경우 병합은 ,의 의미 theirs와는 ours반대입니다. 따라서 병합 하는 동안 동일한 효과를 얻으려면 , 즉 병합ours 중인 원격 브랜치에 대해 현재 브랜치 변경 사항 ( )을 유지하십시오 ( theirs).

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

2
글쎄, 이것은 꽤 중요한 차이점입니다! 설명해 주셔서 감사합니다.
verboze

26

참고 git checkout --ours|--theirs것입니다 완전히 파일을 덮어 중 하나를 선택하여, theirs또는 ours수 있습니다 또는 당신이 (당신이 다른 측면에서 오는 비 충돌 변경이있는 경우, 그들은 잃게됩니다) 수행 할 작업을하지 않을 수 있습니다 버전.

대신 파일에 세 방향 병합을 수행, 만 해결하려는 경우 충돌 심술쟁이 사용하는 --ours|--theirs반면, 비 충돌 심술쟁이 유지 장소에서 양측을, 당신은에 의존 할 수 있습니다 git merge-file; 이 답변의 세부 사항을 참조하십시오 .


1
"충돌하지 않는 변경 사항"과 관련하여 손실 될 것입니다. 이것은 동일한 파일에있는 특정 행에있는 충돌하지 않는 변경 사항이있는 파일 또는 정렬 된 히스토리에있는 모든 파일의 모든 변경 사항을 의미합니까?
ktamlyn

2
@ktamlyn "충돌하지 않는 변경"으로 같은 파일의 변경을 의미했습니다. 예를 들어, 버전 에는 두 개의 변경된 덩어리 (부품)가 example.txt있으며 ours, 하나는 충돌하고 ( theirs수정본 에서도 변경됨 ), 다른 하나는 충돌 하지 않습니다. 그렇게하면 수정시 git checkout --theirs example.txt전체 파일을 맹목적으로 읽게 theirs되며 diff의 충돌하지 않는 부분은 손실됩니다.
jakub.g

1
감사! "동일한 파일의 변경"이이 문맥에서 가장 의미가 있지만, 이것은 나에게 필요한 설명이었습니다.
ktamlyn

실제로 답변을 제공하지는 않지만 다른 제안 된 솔루션에서 중요한 문제를 지적하지만 이것은 받아 들일만한 대답이어야합니다.
tomasyany

1
원래 충돌 된 파일로 돌아가려면 실행할 수 있습니다 git checkout --merge <path>.
Andrew Keeton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.