source

모든 파일에 대해 --ours/--theirs를 사용하여 충돌 해결

bestscript 2023. 8. 8. 23:47

모든 파일에 대해 --ours/--theirs를 사용하여 충돌 해결

체크아웃을 사용하여 모든 파일에 대한 충돌을 해결할 수 있는 방법이 있습니까?--ours그리고.--theirs개별 파일에 대해 할 수 있다는 것은 알고 있지만 모두를 위한 방법을 찾을 수 없었습니다.

작업 디렉토리를 훑어보고 xargs 명령을 통해 출력을 전송하기만 하면 됩니다.

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

또는

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

작동 방식:grep현재 디렉토리에 있는 모든 파일을 검색합니다..) 및 하위 디렉터리는 재귀적으로 (더-rflag) 충돌 마커('<<<<' 문자열)를 찾습니다.

-l또는--files-with-matchesflag를 지정하면 grep은 문자열이 발견된 파일 이름만 출력합니다.첫 번째 일치 후 검색이 중지되므로 일치하는 각 파일은 한 번만 출력됩니다.

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

자세한 내용은 이 링크를 참조하십시오.

명령줄에서 매번 이를 입력해야 하는 번거로움이 있으므로 자주 사용하는 경우에는 원하는 셸에 대한 별칭을 생성하는 것이 나쁘지 않을 수 있습니다.Bash는 보통의 입니다.

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

넌 할 수 있다.-Xours또는-Xtheirs와 함께git merge뿐만 아니라.그래서:

  1. 현재 병합을 중단합니다(예: 를 사용).git reset --hard HEAD)
  2. 원하는 전략을 사용하여 병합(git merge -Xours또는git merge -Xtheirs)

고지 사항: 물론 하나의 옵션만 선택할 수 있습니다.-Xours또는-Xtheirs물론 다른 전략을 사용해야 합니다. 파일별로 이동해야 합니다.

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

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

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

그 일을 하는 것 같습니다.이 작업을 수행하려면 gitrepo의 루트 디렉토리에 cd'되어야 합니다.

시나리오 1

다른 사용자가 한 분기의 모든 내용을 다른 분기의 내용(예:master), 더 쉬운 방법이 있습니다.

git merge origin/master --strategy=ours

https://stackoverflow.com/a/1295232/560114 덕분입니다.

시나리오 2

반대로 "git merge - sours"의 "theys" 버전이 있습니까?를 참조하십시오.

갱신하다

시나리오 2의 경우 링크된 답변은 다음을 사용할 것을 권장합니다.

git checkout branchA
git merge -X theirs branchB

저는 이것이 정확히 반대가 아니라는 것을 발견했습니다.--strategy=ours또한 병합 충돌이 발생할 수도 있습니다(경우에 따라 실제로 제거하고자 했던 다른 분기의 코드도 보관됩니다).그래서 만약 당신이 진정으로 반대의 해결책을 원한다면,git merge other-branch --strategy=ours가장 좋은 방법은 두 단계(두 번 병합)로 수행하는 것입니다.대체하는 것이 목표라고 가정합니다.branch-abranch-b그런 다음 첫 번째 단계는 다음과 같습니다.

git checkout branch-b
git fetch branch-a
git merge branch-a --strategy=ours

이제 branch-b는 충돌 없이 branch-a로 병합될 준비가 되었습니다.이 시점에서, 만약 당신이 Github과 같은 것을 사용하고 있다면, 당신은 PR을 올려 branch-b를 branch-a로 병합할 수 있습니다.또는 동료 검토가 필요하지 않은 경우 다음과 같이 직접 병합할 수 있습니다.

git checkout branch-a
git merge branch-b

# Cleanup - delete branch-b (if desired)
git branch -d branch-b
git push origin --delete branch-b
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

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

다음과 같은 방식을 사용:gitcheckoutall theirs또는gitcheckoutall ours

언급URL : https://stackoverflow.com/questions/24743769/git-resolve-conflict-using-ours-theirs-for-all-files