2014-07-14 12 views
66

체크 아웃 --ours--theirs을 사용하여 모든 파일의 충돌을 해결할 수 있습니까? 나는 당신이 개별 파일을 위해 그것을 할 수 있지만 모든 것을 위해 그것을 할 수있는 방법을 찾을 수 없다는 것을 안다.모든 파일에 대해 --ours/- theirs를 사용하여 Git 해결 충돌

+4

'git checkout --ours - .'가 작동합니까? '.'는 작업 디렉토리 루트에서 적용될 때 현재 디렉토리를 의미하므로 기본적으로 전체 작업 디렉토리를 의미합니다. 그것이'--ours' 플래그와 함께 작동하는지 확신 할 수 없으며 삭제되거나 이름이 변경된 파일 충돌을 어떻게 처리 할 것인지 확신 할 수 없습니다. –

+0

@Cupcake 성공적으로 사용했습니다. 어쩌면 그게 답이 될까요? –

답변

62

그냥 작업 디렉토리를 통해 grep을하고 xargs를 명령을 통해 출력을 보내

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

또는이 어떻게 작동

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

: grep은 (현재 디렉토리에있는 모든 파일을 검색합니다 .) 및 서브 디렉토리를 반복적으로 찾습니다 (-r 플래그). 충돌 표시기 (문자열 '< < < < < < < ')

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

일치 된 파일 이름은 다음 piped, xargs에 있습니다 git checkout --ours 또는 --theirs

at this link에 대한 개별 인수에 파이프 입력 스트림을 분해하는 유틸리티.

매번 명령 줄에서이 값을 입력해야하는 불편 함이 있으므로 자신이 많이 사용하는 것으로 밝혀지면 Bash을 선택하여 alias을 만드는 것이 좋지 않을 수 있습니다. 평범한 것입니다.

이 방법은 적어도 망할 놈의 버전 2.4.x

+9

grepping 대신에 ['git diff --name-only --diff-filter = U'] (http://stackoverflow.com/a/10874862/559913)를 사용하는 것이 가능하다고 생각합니다. – Thai

+7

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

+1

@joshbodily 니스. 나는 큰 차이가 있음을 알 수있는 프로젝트가 없지만, 디렉토리의 총 수와 비교하여 파일이 거의 변경되지 않은 경우에 훨씬 더 빠를 수 있음을 알 수 있습니다. 커밋. – Dmitri

30

할 수 있습니다 git merge-Xours 또는 -Xtheirs뿐만 아니라 통해 작동합니다. 그래서 (git reset --hard HEAD와 예를 들어) 현재 병합 중단

  1. 은 당신이 선호하는 전략 (git merge -Xours 또는 git merge -Xtheirs)

를 사용

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

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

  • +0

    감사합니다. 병합을 위해 '-'및 '--theirs'가 있는지 몰랐습니다. 병합을 위해서는 실제로 '-s'전략의 일부가 아니고 '-X'재귀 옵션의 일부인 것처럼 보입니다. 우리의 '-s'버전은 실제로 병합하지 않고 모든 파일을 대체하고 그 파일은 존재하지 않습니다. – exe163

    +0

    v1.9.4를 사용할'- theirs' 또는'--ours'-Option은 없습니다. 접근 방법은'git merge -s recursive -Xtheirs BRANCH'입니다. – fbmd

    +0

    '--theirs'와'--ours'는 git'2.2.0'과 함께 사용할 수 없습니다. 내 대답이 정확하지 않거나 이전 버전의 git 버전에서 사용 가능했다 (이 답변은 IT 시대에 상당히 오래된 것임). 올바른 접근 방식은'-X'입니다. 그에 따라 적절히 업데이트합니다. – ThanksForAllTheFish

    21

    git checkout --[ours/theirs] .은 모든 갈등의 근원이되는 한 원하는대로 할 수 있습니다. ours/theirs는 병합되지 않은 파일에만 영향을 미치므로 grep/find/etc 충돌을 구체적으로 찾아야하지 않아도됩니다.

    +4

    저에게 이것은 하위 디렉토리로 재귀하지 않는 것 같습니다. –

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

    작업을 수행하는 것으로 보입니다. 이를 달성하기 위해서는 git repo의 루트 디렉토리로 cd해야한다.