패치를 적용 할 때 충돌을 해결할 수있는 방법이 있습니까?


124

나는 창문 위에있다.

여러 가지 이유로 우리는 서로 다른 svn 브랜치의 여러 git 인스턴스를 가지고 있습니다.

여러 번 저장소 A의 문제를 수정하고 패치를 생성하여 저장소 B에 적용하고 싶습니다. 충돌이있는 경우를 제외하고는 정상적으로 작동합니다.

리베이스 할 때 폴더를 마우스 오른쪽 버튼으로 클릭하고 tortioseGit을 사용하고 해결 옵션을 선택하십시오. 이것은 내 갈등을 해결할 수 있도록 멋진 GUI를 제공합니다.

거부 된 패치 청크로이를 수행 할 수있는 방법이 있습니까?

다음은 패치 생성 / 적용에 대한 나의 현재 접근 방식입니다.

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
모든 패치 옵션이 실패 할 때 보통 손으로 그것을 할 ...
STDCALL

병합이 실패하면 프로그램 이 병합을 명확하게 수행하는 방법을 알아낼 없기 때문 입니다. <<<<, ===, >>>> 세트가있는 파일을 가져 와서 수동으로 해결해야합니다.
tacaswell

예, 손으로하는 것은 몇 백 레지 덩어리를 말할 때 진짜 피타입니다.
Kenoyer130

사용하려는 것하다고 git mergetool과 당신의 선택의 GUI를 3 방향 병합을 할 수는 ... (나는 창문에 kdiff에 부분 해요)
g19fanatic

답변:


254

패치를 생성하려면 다음을 수행하십시오.

git format-patch --stdout first_commit^..last_commit > changes.patch

이제 패치를 적용 할 준비가되면 :

git am -3 < changes.patch

-3충돌이 발생하는 경우 삼원 병합을 할 것입니다. 이 시점에서 당신은 할 수 있습니다 git mergetool당신이 GUI로 이동하거나 수동으로 (표준 정력을 사용하여 파일을 병합 할 경우 <<<<<<, ||||||, >>>>>>갈등 해결을).


3
추가 --ignore-whitespace --ignore-space-change하는 git am것도 유용 할 수 있습니다 . 나는 그것 없이는 진행되지 않는 사소한 병합을 가졌습니다.
angularsen

12
git apply -3 changes.patch뿐만 아니라 나를 위해 작동하는 것 같다
peterflynn

1
패치가 제대로 적용되지 않더라도 git mergetool. 대신 사용 된 원래 패치가 적용된 기본 커밋을 찾아 그 위에 적용한 다음 (다행히 내 저장소에이 기능이 있음) 리베이스해야했습니다.
jozxyqk

4
@jozxyqk와 같은 문제가 있습니다. 어느 쪽 git am -3git apply -3사실은 내가 좋아하는 메시지를 얻을에도 불구하고, 내 파일에 충돌 마커를 드롭하지 않습니다 Applied patch to 'configure.ac' with conflicts.error: patch failed: .... 에 git 2.17.1있습니다. 일부 파일을 전혀 패치 할 수없는 경우 git이 롤백됩니까?
nh2

1
@ nh2와 같은 문제가 발생했습니다. 문제를 발견 한 적이 있습니까?
Eridanis

12

패치 적용, 리베이스 또는 병합시 동일한 충돌 세트가 자주 발생하는 경우 git rerere (기록 된 해결 재사용) 기능을 사용할 수 있습니다. 이를 통해 과거에 해결 한 방법을 기반으로 충돌을 해결해야하는 방법을 미리 정의 할 수 있습니다. 작동 방식에 대한 자세한 내용은 http://git-scm.com/blog/2010/03/08/rerere.html 을 참조하십시오 .


5

TortoiseGit에는 패치 파일을 열 수있는 병합 기능이 있습니다.

여기에 사진이 있습니다 .


실제로 병합 옵션이 내가 찾고있는 것일 수 있습니다.
Kenoyer130

정말? 오랫동안 거북이를 사용하지 않았지만 링크 된 페이지에 "TortoiseMerge가 Git 패치 파일을 직접 열 수 있습니다. 검토하고 작업 복사본에 패치 할 수 있습니다."라는 텍스트가 있으므로 그래야 할 것 같습니다!
ams

패치 파일을 엽니 다 ...하지만 패치 파일 형식이 tortoisegitmerge를 깨는 경우가 있습니다. 나는 diff -u로 성공한 적이 없지만 diff -c 출력입니다.
thistleknot aug

작업 트리 폴더에서 패치를 마우스 오른쪽으로 드래그하고 "Apply patch serial"(0001-xxx.patch, ... 0002-xxy.patch와 같은 패치의 경우) 또는 "Apply single patch file"을 선택할 수도 있습니다.
MrTux

2

내 접근 방식은 다음과 같습니다.

  • 파일이 동일한 "통합"분기를 만듭니다.
  • 이 통합 지점에 패치 적용
  • 마스터에 병합하거나 리베이스합니다 (추가 패치를 적용 할 때 어떤 일이 발생할지 모르기 때문에 여기서 리베이스가 유용한 지 모르겠습니다)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.