체크 아웃 사용하는 모든 파일에 대한 분쟁 해결 할 수있는 방법이 있나요 --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 에서 작동해야합니다.
답변
당신은 할 수 -Xours
또는 -Xtheirs
과 git merge
뿐만 아니라. 그래서:
- (예를 들어 함께 현재 병합을 중단
git reset --hard HEAD
) - 선호하는 전략을 사용하여 병합 (
git merge -Xours
또는git merge -Xtheirs
)
면책 조항 : 물론 하나의 옵션 만 선택할 수 있습니다. -Xours
또는 -Xtheirs
, 물론 파일별로 이동해야하는 다른 전략을 사용하십시오.
에 대한 방법이 있는지는 모르겠지만 checkout
솔직히별로 유용하지 않다고 생각합니다. 체크 아웃 명령을 사용하여 전략을 선택하는 것은 다른 파일에 대해 다른 솔루션을 원하는 경우 유용하고 그렇지 않으면 병합 전략 접근 방식을 사용합니다.
답변
git checkout --[ours/theirs] .
당신이 모든 갈등의 근원에있는 한 당신이 원하는 것을 할 것입니다. ours / theirs는 병합되지 않은 파일에만 영향을 미치므로 grep / find / etc 충돌을 구체적으로 수행 할 필요가 없습니다.
답변
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”의 “그들의”버전이 있습니까?를 참조하십시오.
답변
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}
.zshrc 파일 에이 기능을 추가했습니다 .
다음과 같이 사용하십시오.
gitcheckoutall theirs
또는gitcheckoutall ours