2013-07-14 3 views
15

현재 현재 두 개의 브랜치가 있습니다. 소프트웨어 업데이트로 인해 폴더 구조를 completly 변경해야했습니다. 따라서 두 가지 파일을 모두 이동합니다. 이제는 작업 브랜치를 마스터 브랜치에 병합하고자하는 시점에 도달했습니다.git - 두 브랜치에서 같은 파일을 추가하면 이상한 병합 충돌이 발생합니다.

문제는 파일이 하나의 분기 (added by them 또는 added by us) 만 추가되었다는 병합 충돌이 있다는 것입니다. 문제는 해당 파일이 모두 가지로 추가 된 것입니다.

예를 들어 나는 질감이 textures/texture1.png입니다. 마스터 브랜치는 방금 올바른 위치로 이동했습니다 (misc/textures/texture1.png 전). 작업 브랜치는 그것을 동일한 위치로 옮기고 나중에 편집했습니다. 이 파일의 병합 충돌이 말한다 :

added by us: textures/texture1.png 

요점은이 하지 내가 원하는 파일이라는 것이다! 다른 지점의 파일을 원합니다!
내가

git checkout --theirs textures/texture1.png 

내가

error: path 'textures/texture1.png' does not have their veresion 

받을 수 있나요하지만이 파일 이 존재하는 경우! 최근에 추가했습니다! 그리고 그게 내가 원하는 파일이야

어떻게 이러한 충돌을 해결할 수 있습니까?

은 (자세한 내용은 필요한 경우!)

+0

사이드 참고 : 자식이 당신을 아주 두 파일의 이름을 변경 말할 수 없습니다 git이 동적 이름 바꾸기 탐지를 수행 할 때 파일을 편집 했으므로 여기서 작업을 수행하지 않습니다. 나는 "파일 이름 바꾸기"커밋을 "커밋 된 파일 수정하기"에서 커밋을 분리하는 것을 실험하지는 않았다. 그러나 그것들을 분리하는 것은 자식들을 "그림을 그려내는"기회를 더 많이 주겠다고 생각한다. 특히 "헬퍼 브랜치 (helper branch)"기술에 대해 도움이 될 것입니다. @mnagel – torek

답변

8
a--b--c--M--d--f--E--g--h--i <<< master 
    \ 
    \ 
     x--M'--y--z    <<< you 

상황이 다소 위처럼 보입니다. 여기서 M과 M '은 커밋을 이동하고 E는 텍스처를 편집하는 커밋입니까? 당신은 z/i와 merit를 시도하고 자식은 정말 행복하지 않습니다.

당신은 ("i"가) 당신과 함께 도우미 ("X") ("Z")와 마스터를 임시 지점

a--b--c---M--d--f--E--g--h--i <<< master 
    \  \ 
    \  X     <<< helper 
     \ /
     x--M'--y--z    <<< you 

에 'M과 M을 병합 한 후 병합 시도 할 수 있습니다.

a--b--c---M--d--f--E--g--h--i  <<< master 
    \  \     \ 
    \  X-----XX---------XXX <<< helper 
     \ / /
     x--M'--y--z    <<< you 

그런 방식으로 충돌이 발생하고 충돌이 발생하지 않고 직접 해결됩니다. 시간이 지남에 따라 갈등이 커지는 경향이 있기 때문에이 방법이 더 쉽습니다.

+0

요점은 E가 브랜치 "you"에 있다는 것입니다. 그러나 나는 이것을 시도 할 것이다. 그리고 당신의 방법으로 나는 XXX을 마스터에 병합합니까? 그것이 내가 최종 병합을 원하는 곳이기 때문입니다. – BrainStone

+1

어떤 지점 E가 실제로 중요한 것은 아닙니다. 중요한 것은 조기에 병합을 수행하고 충돌 해결 방법을 쉽게 (실제로 작동한다는 보장이 없음)하는 것입니다. 세 번째 그래프에 묘사 된대로 상태가되면, XXX가 i의 후속이기 때문에 충돌없이 마스터를 도우미/XXX에 빨리 감기 할 수 있습니다. – mnagel

+0

이것은 나를 위해 일했습니다! 멍청한 놈을 도와 줘서 고마워. GitHub의 네트워크 기록은 재미있어 보이지만 괜찮습니다.) – BrainStone

9

당신은 항상이 방금 적절한 링크를 클릭하여 원하는 변경을 선택할 수있는 GUI가 열립니다

git mergetool 

시도 할 수 있습니다. 때로는 수동으로 변경해야합니다. 그러나 귀하의 경우에는 파일 이미지를 선택하기 만하면됩니다.

+0

이것은 도움이되지 않습니다. 하나의 브랜치가 파일을 지우고 같은 것을 알려주기 때문에. – BrainStone

2

해결 충돌은 당신이 파일 얻고 싶은 곳에서 권리를 트리 틱 (지점 이름, 태그, 커밋의 SHA1을 ...) 나타내는 git checkout를 사용하는 반면 :

git checkout theirBranchYouAreMerging -- textures/texture1.png 

당신이 만약을 "모든"변경 사항을 원하지 않으면 부분적으로 취소 할 수 있습니다.이를 위해 당신은뿐만 아니라 작업 디렉토리에서 제거 후 git checkout을 선택적으로 인덱스에서 바람직하지 않은 변화를 제거하기 위해 git reset -p 필요하고, 다음과 같습니다

git checkout theirBranch -- some/file.txt 
git reset -p -- some/file.txt 
git checkout -- some/file.txt