체크 아웃 사용하는 모든 파일에 대한 분쟁 해결 할 수있는 방법이 있나요 --ours
과 --theirs
? 개별 파일에 대해 할 수 있지만 모두를 위해 할 수있는 방법을 찾을 수 없다는 것을 알고 있습니다.
체크 아웃 사용하는 모든 파일에 대한 분쟁 해결 할 수있는 방법이 있나요 --ours
과 --theirs
? 개별 파일에 대해 할 수 있지만 모두를 위해 할 수있는 방법을 찾을 수 없다는 것을 알고 있습니다.
답변:
작업 디렉토리를 통해 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 에서 작동해야합니다.
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. 큰 프로젝트가 있으면 grepping보다 빠릅니다.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
당신은 할 수 -Xours
또는 -Xtheirs
과 git merge
뿐만 아니라. 그래서:
git reset --hard HEAD
)git merge -Xours
또는 git merge -Xtheirs
)면책 조항 : 물론 하나의 옵션 만 선택할 수 있습니다. -Xours
또는 -Xtheirs
, 물론 파일별로 이동해야하는 다른 전략을 사용하십시오.
에 대한 방법이 있는지는 모르겠지만 checkout
솔직히별로 유용하지 않다고 생각합니다. 체크 아웃 명령을 사용하여 전략을 선택하는 것은 다른 파일에 대해 다른 솔루션을 원하는 경우 유용하고 그렇지 않으면 병합 전략 접근 방식을 사용합니다.
--theirs
또는 --ours
-Option 이 없습니다 . 접근 방식은 git merge -s recursive -Xtheirs BRANCH
.
--theirs
및 --ours
사용할 수도 자식으로하지 않습니다 2.2.0
. 내 대답이 정확하지 않거나 이전 git 버전에서 사용 가능했습니다 (이 대답은 IT 시대에서 꽤 오래되었습니다). 올바른 접근 방식은 -X
. 그에 따라 업데이트합니다
git checkout --[ours/theirs] .
당신이 모든 갈등의 근원에있는 한 당신이 원하는 것을 할 것입니다. ours / theirs는 병합되지 않은 파일에만 영향을 미치므로 grep / find / etc 충돌을 구체적으로 수행 할 필요가 없습니다.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
일을 할 것 같습니다. 이 작업을 수행하려면 git repo의 루트 디렉토리로 이동해야합니다.
다른 사람이 한 브랜치 (예 : 마스터)의 모든 것을 다른 브랜치의 내용으로 덮어 쓰려는 경우 더 쉬운 방법이 있습니다.
git merge origin/master --strategy=ours
https://stackoverflow.com/a/1295232/560114 덕분에
또는 다른 방법으로 "git merge -s ours"의 "그들의"버전이 있습니까?를 참조하십시오.
git checkout --ours -- .
작업?.
수단은 기본적으로 전체 작업 디렉토리를 의미하므로, 작업 디렉토리 루트에서 적용되는 현재 디렉토리.--ours
그래도 플래그 와 함께 작동 하는지 확실하지 않으며 삭제되거나 이름이 변경된 파일 충돌을 어떻게 처리할지 모르겠습니다.