2013-11-22 3 views
0

두 개 이상의 개발자가 충돌 한 것으로 변경된 파일에 git을 설정할 수 있는지 파악하려고합니다. 그 파일 안의 같은 줄이 수정되었습니다. 다음은 예입니다.다른 개발자가 변경 한 내용을 충돌로 식별하도록 git를 구성하는 방법

두 개발자는 로컬 시스템에서 원격 저장소를 복제하여 시작합니다. 개발자 1은 파일 A를 변경합니다. 파일을 변경 한 최초 개발자이기 때문에 충돌이 없으며 변경 한 내용을 로컬 repo에 커밋 한 다음 변경 내용을 원격 저장소로 푸시합니다. 개발자 1이 작동하는 동안 개발자 2도 동일한 파일에서 작업했지만 코드가 겹치지 않도록 완전히 다른 영역에서 작업했습니다. 개발자 2는 자신의 로컬 repo에 대한 변경 사항을 커밋 한 다음 당긴다. 이 시점에서, 자식 자동 라인의 병합을 할 것으로 보인다.

가끔은 괜찮습니다. 그러나 다른 경우가 있는데,이 파일이 확실히 확인되지 않았기 때문에 원격 저장소에 푸시되기 전에 파일을 검토하고 업데이트해야합니다. 이는 충분히 중요하며, 종종 저장소에 푸시하기 전에이를 모든 파일에 적용하기를 원할 때까지 충분히 발생합니다. 따라서, 문제는 - 파일을 마지막으로 가져온 후 다른 개발자가 변경 한 경우 파일을 충돌로 식별하도록 병합을 구성 할 수 있습니까? git merge 명령을 보았습니다 here. 병합 전략을 제공하더라도이 기능을 제공 할 수있는 기능은 없습니다. 이 기능을 구현하는 것이 어렵지 않아야합니다. 완료되어야 할 모든 일은 파일 A에 대한 개발자의 로컬 저장소 버전 (마지막 풀에서)이 원격 저장소의 파일 A에 대한 현재 버전과 일치하는지 확인하는 것입니다. 그렇지 않다면 충돌하는 것으로 플래그를 지정하십시오. 어떤 방식 으로든이 작업을 수행 할 수 있습니다. 또는 변경된 파일을 확인하기 위해 사용할 수있는 다른 아이디어를 통해 repo로 이동하기 전에 검토해야합니까?

+0

지금까지는 제목 만 읽었지만 나쁘게 들립니다 ... 충돌에 대한 생각은 힘내에서 잘 정의되어 있습니다. 힘내라가 충돌이없는 곳을 찾아 내고 싶니? – marekful

+0

@ MarcellFülöp 다른 개발자가 다른 개발자가 원격 Repo를 업데이트 한 시점을 감지 할 수 있기를 바랍니다. 개발자가 체크인하기 전에 변경 사항을 업데이트해야할지 결정할 수 있습니다. 그럼 거기 GUI 도구가있을 수 있습니까? –

답변

1

저는 이렇게 말하고 싶습니다. git merge 내부에서 이것을 시도하지 마십시오. 대신 외부 스크립트를 사용하십시오. (개발자가 물론 스크립트를 사용하게하는 데 몇 가지 문제가있을 수 있습니다 .-))

다음과 같이 제안 된 방식대로 스크립트를 만들 수 있습니다. "repo 파일을 기본 파일로 비교하고 repo 파일을 다음과 비교하십시오. 단지-사전이 "(/ REBASE 병합) :

# if on branch foo that maps to origin/foo 
git tag compare-foo <commit-id> 
git fetch origin 
git diff <optional-args> compare-foo origin/foo 
# or use git diff-tree and do your own post-processing 
# add more stuff to compare the merge-base to the 
# developer's version of branch foo to identify files 
# that were modified by "both" 
# when all satisified: git tag -d compare-foo 

이 커밋 ID를 선택하려면 git merge-base 사용할 수 있습니다, 예를 들면 :

cid=$(git merge-base foo origin/foo) 

아니면 그냥 origin/foo 정확한 지점이라고 가정한다, 즉, 개발자가 업데이트하는 대신이 프로세스를 실행합니다. origin/foo을 스트레이트로 수행하면 git fetch입니다. (또는 아래 fancy-up을 참조하십시오.)

개발자는 "나는 비교를했는데 모두 괜찮습니다."라고 주장하여 프로세스를 멋지게 만들 수 있습니다. 세부 사항은 개발자와 개발자에게 달려 있습니다. 예를 들어, refs/tags 네임 스페이스 외부에서 참조를 만들고 /하거나 git notes을 일반적인 메모와 다른 이름 공간으로 사용하려고 할 수 있습니다. 일단 서명이 해제되면, 이는 다른 개발자가 커밋을 성공적으로 푸는 측면에서 후속 비교를위한 출발점 역할을 할 수 있습니다.

참고 :이 항목은 실제 테스트를 대신 할 수 없습니다 (하지만 테스트는 변경 사항을 확인하는 대신 사용할 수 없습니다).

+0

GitExtensions와 같은 git gui 도구를 사용하여 스크립트를 입력 한 다음 다른 파일마다 순차적으로 호출되는 차이 프로그램을 사용할 수 있습니까? –

+0

저는 대부분 GUI의 대부분을 피합니다. 때로 gitk를 사용하여 브랜치를 시각화하고 그 점에 대해 설명합니다. 그래서, 나는 당신이 GUI에서 또는 GUI를 사용하여 이것을 어떻게 몰아 낼지 모른다. – torek

관련 문제