브랜치에서 파일 제거로 인한 병합 충돌을 어떻게 해결합니까?


208

dialog지점 을 만들고 지점과 병합하려고 할 때 master. 두 가지 충돌이 있습니다. 해결 방법을 모르겠습니다 CONFLICT (delete/modify). 어떻게해야하는지 말씀해 주시겠습니까?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

나는 src/DialogAdapter.java갈등을 해결하고 해결했다 git add src/DialogAdapter.java. 다른 무엇을해야합니까?


스택 오버플로 에서이 게시물을 읽을 수 있습니다 : -Git에서 병합 충돌을 어떻게 해결합니까? 허용되는 답변은 git manual을 참조하십시오 .
09:17에 무겁게 함

답변:


271

충돌 메시지 :

충돌 (삭제 / 수정) : res / layout / dialog_item.xml이 대화 상자에서 삭제되고 HEAD에서 수정되었습니다.

이는 res/layout/dialog_item.xml병합중인 'dialog'분기에서 삭제되었지만 HEAD (병합중인 분기)에서 수정 되었음을 의미합니다 .

그래서 당신은 여부를 결정해야

  • " git rm res/layout/dialog_item.xml"를 사용하여 파일 제거

또는

  • " git add res/layout/dialog_item.xml" 를 사용하여 HEAD (아마도 편집 한 후)의 버전을 수락하십시오.

그런 다음 " git commit"로 병합을 마무리 합니다.

git은 원하지 않는 (희귀 한) 병합 커밋을 만들고 있음을 경고합니다. 아마도 그 사건이 덜 드문 시절부터 남아있을 것입니다.


22
전 (시도 git rm …)하지만 난 얻을 …: needs merge하고 rm '…'있는 내가 힘든 시간을 해석하는 데 문제입니다. 그런 다음 커밋하려고하면 stackoverflow.com/questions/19985906/… 이 다시 나타납니다.
Jesse Glick

17
그 의견의 후반부에는 신경 쓰지 마십시오. Git의 출력은 다소 놀랍지 만 무해한 것 같습니다.
Jesse Glick

4
대량 접근이 있습니까? 내가 지키고 싶지 않은 외부 물건에 의존하는 프로젝트가 있습니다. 그래서 업스트림에서 수정 된 많은 파일이 있으며 내 지점에서 무엇을하든 관계없이 삭제하려고합니다. 하나씩하는 것이 지루합니다.
mlt

2
@mit : git ls-files --stage및 / 또는 git status --porcelain및 / 또는 git diff-files <something>변경된 파일 목록을 가져 와서 파일을 삭제하거나 자신의 버전을 수락하는 스크립트를 구동 할 수 있습니다.
Jakub Narębski

1
@Honey : CONFLICT 메시지에는 어느 지점에서 어떤 변경이 있었는지에 대한 설명이 포함됩니다. 나중에 git status또는로 확인할 수 있습니다git diff --cc . 또한 git log --merge도움이 될 수도 있습니다 ...
Jakub Narębski

74

나는 보통 그냥 달려 git mergetool 되며 수정 된 파일을 유지하거나 삭제 된 상태로 유지할 것인지 묻는 메시지가 표시됩니다. IMHO는 파일 당 여러 명령 대신 하나의 명령이기 때문에 가장 빠른 방법입니다.

특정 서브 디렉토리에 여러 개의 삭제 된 파일이 있고 파일을 삭제하여 모든 파일을 해결하려는 경우 다음을 수행 할 수 있습니다.

yes d | git mergetool -- the/subdirectory

d각 파일을 삭제 선택하기 위해 제공됩니다. m수정 된 파일을 유지하는 데 사용할 수도 있습니다 . 실행할 때 표시되는 프롬프트에서 가져옵니다 mergetool.

Use (m)odified or (d)eleted file, or (a)bort?

1
@BrianMinton 저도 다른 것들은 악순환이었습니다
Nate L

2
파일이 많을 때 성가신 일입니다. 모두에게 하나의 대답을 줄 수있는 방법이 있습니까?
ideasman42

2
@ ideasman42 일괄 삭제 솔루션을 표시하도록 답변을 업데이트했습니다.
void.pointer

1
나는 실제로 병합 도구에 대해 몰랐다. 내 친구를 구했어!
Mert

6

창에서 Git Gui를 사용하는 경우

  1. 병합 중단
  2. 목표 지점에 있는지 확인하십시오
  3. 탐색기에서 충돌하는 파일 삭제
  4. Git Gui (F5)의 변경 사항을 다시 검색
  5. 충돌하는 파일이 삭제되었습니다.
  6. 커밋 메뉴에서 커밋 할 스테이지 변경 파일 선택 (Ctrl-I)
  7. "삭제 된 충돌 파일"과 같은 커밋 주석을 입력하십시오.
  8. 커밋 (Ctrl-enter)
  9. 이제 병합을 다시 시작하면 희망적으로 작동합니다.

5
그 사람은 GUI로 Git을 처리하는 방식을 좋아하지 않을 것입니다. 명령 줄 방식이 더 좋습니다.
Souris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.