Git은 모든 파일에 대해 --ours /-theirs를 사용하여 충돌을 해결합니다.


111

체크 아웃 사용하는 모든 파일에 대한 분쟁 해결 할 수있는 방법이 있나요 --ours--theirs? 개별 파일에 대해 할 수 있지만 모두를 위해 할 수있는 방법을 찾을 수 없다는 것을 알고 있습니다.


7
합니까의 git checkout --ours -- .작업? .수단은 기본적으로 전체 작업 디렉토리를 의미하므로, 작업 디렉토리 루트에서 적용되는 현재 디렉토리. --ours그래도 플래그 와 함께 작동 하는지 확실하지 않으며 삭제되거나 이름이 변경된 파일 충돌을 어떻게 처리할지 모르겠습니다.

@Cupcake 나는 그것을 성공적으로 사용했습니다. 대답이되어야할까요?
Pedro Gimeno 2015 년

답변:


90

작업 디렉토리를 통해 grep하고 xargs 명령을 통해 출력을 보냅니다.

grep -lr '<<<<<<<' . | xargs git checkout --ours

또는

grep -lr '<<<<<<<' . | xargs git checkout --theirs

작동 방식 : grep현재 디렉토리 ( .) 및 하위 디렉토리 ( -r플래그)에있는 모든 파일을 반복적으로 검색 하여 충돌 마커 ( '<<<<<<<'문자열)를 찾습니다.

-l또는 --files-with-matches플래그는 출력 문자열이 발견 된 경우에만 파일 이름을 GREP됩니다. 첫 번째 일치 후 검색이 중지되므로 일치하는 각 파일은 한 번만 출력됩니다.

일치하는 파일 이름은 파이프 된 입력 스트림을 또는에 대한 개별 인수로 분할하는 유틸리티 인 xargs파이프 됩니다.git checkout --ours--theirs

이 링크에서 자세히 알아보십시오 .

매번 명령 줄에 입력해야하는 것은 매우 불편할 수 있으므로 자주 사용하는 경우 선택한 셸에 대한 별칭 을 만드는 것이 나쁘지 않을 수 있습니다 . Bash 는 일반적인 것입니다. .

이 방법은 최소한 Git 버전 2.4.x 에서 작동해야합니다.


14
grepping 대신 사용할 수도 있다고 생각합니다 git diff --name-only --diff-filter=U.
태국어

10
또한 git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. 큰 프로젝트가 있으면 grepping보다 빠릅니다.
joshbodily

1
트윗 담아 가기 나는 큰 프로젝트를 가지고 있지 않아서 차이를 알아 차릴 수는 없지만 디렉토리의 총 수에 비해 파일이 거의 변경되지 않은 경우 훨씬 더 빠르다 것을 알 수 있습니다. 커밋.
Dmitri

1
이 이름 변경 / 이름 바꾸기 충돌, 예를 들어,에 대한 작업을하지 않습니다CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
보렉 버나드

1
또 다른 옵션 : git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax

52

당신은 할 수 -Xours또는 -Xtheirsgit merge뿐만 아니라. 그래서:

  1. (예를 들어 함께 현재 병합을 중단 git reset --hard HEAD)
  2. 선호하는 전략을 사용하여 병합 ( git merge -Xours또는 git merge -Xtheirs)

면책 조항 : 물론 하나의 옵션 만 선택할 수 있습니다. -Xours또는 -Xtheirs, 물론 파일별로 이동해야하는 다른 전략을 사용하십시오.

에 대한 방법이 있는지는 모르겠지만 checkout솔직히별로 유용하지 않다고 생각합니다. 체크 아웃 명령을 사용하여 전략을 선택하는 것은 다른 파일에 대해 다른 솔루션을 원하는 경우 유용하고 그렇지 않으면 병합 전략 접근 방식을 사용합니다.


감사합니다. 병합에 '--ours'와 '--theirs'가 있는지 몰랐습니다. 병합의 경우 실제로 '-s'전략의 일부가 아니라 '-X'재귀 옵션의 일부인 것 같습니다. 우리의 '-s'버전은 실제로 병합하지 않고 모든 파일을 대체하며 해당 파일은 존재하지 않습니다.
exe163 jul.

git v1.9.4 에는 --theirs또는 --ours-Option 이 없습니다 . 접근 방식은 git merge -s recursive -Xtheirs BRANCH.
fbmd

--theirs--ours사용할 수도 자식으로하지 않습니다 2.2.0. 내 대답이 정확하지 않거나 이전 git 버전에서 사용 가능했습니다 (이 대답은 IT 시대에서 꽤 오래되었습니다). 올바른 접근 방식은 -X. 그에 따라 업데이트합니다
ThanksForAllTheFish 2015-06-04

버전 2.4.0부터 --ours 및 --theirs는 여전히 많이 사용 가능합니다. git-scm.com/docs/git-checkout
Dmitri

이것을 시도하고 "자동 병합 실패, 충돌 수정"을 받았습니다. 이 명령은 분명히 의도 한대로 작동하지 않으며 버그가 너무 많으므로 피하는 것이 좋습니다.
Adam

37

git checkout --[ours/theirs] .당신이 모든 갈등의 근원에있는 한 당신이 원하는 것을 할 것입니다. ours / theirs는 병합되지 않은 파일에만 영향을 미치므로 grep / find / etc 충돌을 구체적으로 수행 할 필요가 없습니다.


5
나를 위해 이것은 하위 디렉토리로 재귀하지 않는 것 같습니다.
Daniel Baughman

5
나는 error: path 'foo/bar/blah' does not have our version.
Robin Green

나는 git 버전 2.16.2.windows.1을 사용하고 있으며 완벽하게 작동합니다. 감사!
Pankwood

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

일을 할 것 같습니다. 이 작업을 수행하려면 git repo의 루트 디렉토리로 이동해야합니다.


3
(1) 작업 디렉토리뿐만 아니라 모든 파일에 적용되기 때문에 이것이 최고 투표보다 더 나은 대답이라고 생각합니다. 그리고 (2) 갈등 마커에 대한 욕심이 생기지 않을 것입니다. 여기에있는 'git diff'명령은 병합되지 않은 모든 경로를 나열하며, 정확히 우리가 체크 아웃하려는 경로입니다.
bchurchill

좋은! 나는 항상 충돌 마커 grep의 신뢰성에 대해 걱정했습니다
00-BBB


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

.zshrc 파일 에이 기능을 추가했습니다 .

다음과 같이 사용하십시오. gitcheckoutall theirs또는gitcheckoutall ours

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