Git-선택한 파일에서 병합 충돌 및 수동 병합을 강제하는 방법


82

우리는 공통 마스터 브랜치와 많은 병렬 브랜치가있는 웹 애플리케이션을 유지합니다. 각 설치마다 하나씩, 각각 특정 변경 사항이 거의 없습니다. 소스 코드는 git에서 관리되며 마스터 브랜치에서 병렬 브랜치로 전송 기능과 버그 수정이 필요할 때 훌륭한 도구입니다. 그러나 민감하고 자동 병합이 일반적으로 나쁜 결과를 제공하는 파일은 거의 없습니다. 따라서 병합이 어떻게 든 표시 될 수 있고 모든 병합으로 인해 수동 병합이 필요한 충돌이 발생하면 훨씬 더 쉬울 것입니다.

나는 대답을 찾았다.

  1. 내가 사용하고 --no이 커밋--no-FF 병합 옵션을하지만 동일하지 않습니다.
  2. 여기여기 누군가가 같은 질문을하지만 해결책이 없습니다.
  3. 비슷한 경우는 somefile.php merge = ours를 포함하는 .gitattributes를 사용하여 파일이 병합되는 것을 방지하는 방법 인 것 같습니다 . 충돌을 생성하거나 수동 병합을 강제하는 병합 옵션을 찾으려고했지만 지금까지 아무것도 찾지 못했습니다.
  4. 다음을 포함하는 .gitattributes : somefile.php -merge 는 자동으로 병합되지 않으므로 강제로 병합됩니다. 90 % 해결책이지만 내가 추구하는 것은 자동 병합을 시도하고 성공 여부에 관계없이 충돌로 표시하는 것입니다. 그러나 이것은 지금까지 해결책에 가장 가깝습니다. (... 명확한 설명을 위해 Charles Bailey에게 감사드립니다 ...)
  5. 누군가 사용자 지정 병합 드라이버 ( 1 , 2 ) 를 작성하도록 제안 했지만 어떻게 수행하는지 명확하지 않습니다.

편집 : 변형 4. 설명


6
이것은 당신이 찾고있는 정확한 대답은 아니지만, 같은 이유로 내가 git fetch먼저 한 다음을 사용 git difftool <file> FETCH_HEAD하여 원격 분기의 변경 사항을 로컬에 수동으로 적용 할 수 있습니다.
MHC

MHC : 이것은 좋은 트릭입니다 (특히 각 병렬 분기에 대한 스크립트에 저장하고 파일 자동 병합 방지와 결합 된 경우). 가장 큰 단점은 팀 워크 플로에서 누군가가이 단계를 잊어 버리고 대신 정상적인 병합을 할 수 있다는 것입니다.
Stepan

2
설정 -merge은 파일 병합을 방해하지 않으며 병합 도구를 사용하여 수동으로 수행해야합니다. 이것이 당신에게 필요한 것이 아닙니까?
CB Bailey

내가 원하는 것의 90 %입니다. 병합이 자동으로 수행되기를 원하지만이 민감한 파일의 경우 병합이없는 경우에도 충돌로 간주되므로 매번 수동 확인이 강제됩니다.
Stepan

@Stepan 나는 비슷한 상황에 처해 있기 때문에 뭔가를 명확히하고 싶습니다. -mergein 을 사용하면 .gitatttributes git merge아무 일도 일어나지 않으며 모든 작업이 병합 도구로 중단되어야 한다고 말하는 것은 무엇입니까 ? 따라서 병합 도구에 사용할 <<<<< ===== >>>>가 없습니다. 그리고 Dan의 솔루션이 이것을 제공합니까?
Nero gris

답변:


59

사용자 지정 병합 드라이버 인 옵션 5는 아마도 원하는 항목에 가장 근접하는 방법 일 것입니다. 놀랍도록 쉽습니다. 아래는 당신이 원하는 행동에 아주 가깝게 만들어야한다고 생각하는 예입니다.

먼저라는 병합 드라이버 스크립트를 만듭니다 merge-and-verify-driver. 실행 가능하게 만들고 적절한 위치에 넣으십시오 (저장소의 구성 파일이 의존 할 것이기 때문에이 스크립트를 저장소에 확인하는 것을 고려할 수 있습니다). Git은 민감한 파일의 병합을 수행하기 위해이 쉘 스크립트를 실행할 것입니다.

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

이것은 Git 자체가 일반적으로 수행하는 기본 병합 동작을 수행합니다. 주요 차이점은 스크립트가 항상 0이 아닌 값을 반환한다는 것입니다 (병합이 실제로 충돌없이 해결 된 경우에도 충돌이 있음을 나타냄).

다음으로 사용자 지정 병합 드라이버의 존재를 Git에 알려야합니다. 저장소의 구성 파일 ( .git/config) 에서이 작업을 수행합니다 .

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

이 예에서는 merge-and-verify-driver리포지토리의 최상위 디렉토리 ( ./)에 넣었 습니다 . 그에 따라 스크립트 경로를 지정해야합니다.

이제 중요한 파일에 적절한 속성을 부여하면 해당 파일을 병합 할 때 사용자 지정 병합 드라이버가 사용됩니다. 다음을 .gitattributes파일에 추가 하십시오.

*.sensitive merge=verify

여기서는 이름이 패턴과 일치하는 모든 파일 *.sensitive이 사용자 지정 병합 드라이버를 사용해야 한다고 Git에 지시했습니다 . 당연히 파일에 적합한 패턴을 사용해야합니다.


이 상세한 가이드에 감사드립니다!
Stepan

13
병합 드라이버가 "명백한"솔루션에서 호출되지 않는 것 같습니다. 예를 들어 파일이 한 분기에서만 변경되고 병합을 수행하면 "민감한"파일을 덮어 쓰고 병합 드라이버가 호출되지 않습니다. 그것을 고칠 방법이 있습니까?
VitalyB 2013

이것이 @VitalyB가 제안한 것처럼 실제로 작동합니까? 감사!
filippo 2013 년

1
이것은 작동하지만 머신의 모든 리포지토리에서 이것을 전역 옵션으로 만드는 방법이 있습니까? 또한 명령 줄로 호출하는 방법이 있습니까? 명령 줄에서 병합 전략을 변경하는 것처럼 간단한 방법으로이를 수행 할 수있는 방법이 있었으면합니다.
user1748155

4
@VitalyB 댓글에 추가. 분기가 파일을 동일하게 변경 한 경우에도 병합이 나타나지 않습니다 . 예를 들어, 두 가지 1 버전을 증가, 당신은 아직 미해결, 병합 ... 매우 실제적인 문제에하는 동안이 증가하고 싶습니다 :(.
VasiliNovikov

1

이 두 명령은 사용자 정의 병합 드라이버를 사용하는 것과 동일한 효과를 갖는 것 같습니다.

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

첫 번째 명령은 병합 커밋을 생성하기 전에 병합을 중지하고 두 번째 명령은 원래 충돌이 없었더라도 해결할 충돌로 두 분기에서 수정 된 모든 파일을 표시합니다.


"일회성"솔루션이라는 아이디어가 마음에 들지만 (방금 그런 경우에 부딪 혔음)이 방법이 효과가 없었습니다. Git은 FF로 인해 잘못된 병합이 발생했습니다 (기본적으로 병합).
Nero gris

@Nerogris 실제로 빨리 감기 병합에는 작동하지 않습니다. --no-ff 옵션을 항상 추가 할 수 있지만 두 번째 명령은 병합의 두 분기 중 하나에 공통 조상에서 변경 사항이 없으므로 충돌이 발생하지 않습니다.
louisiuol

내 전역 구성에서 ff를 false로 설정했습니다. 내가 FF 병합이라고 말했을 때 Git에게 그렇게하지 말라고 말하지 않았다면 그랬을 것입니다.
Nero gris

0

참고 :이 문서 " PO 파일 용 git 병합 드라이버 작성 "에서는 파일을 수동으로 병합 할 때 수행 할 수있는 종류의 조작을 설명합니다. 수동 병합에서 특정 데이터를 준비하기 위해 사전 처리 할 수 ​​있습니다.

git merge-file예를 들어 병합 (!) 전에 파일DECRYPT (및 다시 암호화) 하는 데 사용할 수 있습니다 .

귀하의 경우 0이 아닌 상태로 병합 드라이버를 종료하면 병합이 수동으로 수행됩니다.


2
"PO 파일 용 드라이버 병합"링크에 대해 자세히 설명해 주시면 액세스가 거부 된 것 같습니다. 나는 그것이 질문에 대한 답변을 제공하기를 바랍니다. stackoverflow.com/questions/16214067/…
Mikko Rantalainen

@MikkoRantalainen은 직장에서 차단되었으므로 오늘 저녁 집에서 시도해 보겠습니다.
VonC 2013

1
"PO 파일 용 병합 드라이버"도 나에게도 작동하지 않습니다. :(
sampablokuper 2013 년

1
@sampablokuper 동의합니다 : "권한이없는"독자에 대해 기사가 차단되었습니다. 이유는 모르겠습니다.
VonC 2013 년

1
@sampablokuper 지금은이 블로그에 액세스 할 수 없습니다. 내용을 계속 찾아 보겠습니다.
VonC 2013-06-10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.