병합 충돌을 해결 한 후 병합을 어떻게 완료합니까?


282

Git 커뮤니티 북 의 기본 분기 및 병합 섹션을 읽었습니다 .

그래서 나는 그것을 따라 하나의 지점을 만듭니다 experimental.

그럼 내가:

  1. 실험 분기로 전환 (git checkout Experiment)
  2. 많은 변화를 주다
  3. 커밋 (git commit -a)
  4. 마스터 브랜치로 전환 (git checkout master)
  5. 몇 가지를 변경하고 거기에 커밋
  6. 실험으로 전환 (git checkout Experiment)
  7. 마스터 변경 사항을 실험으로 병합 (git merge master)
  8. 충돌이 있지만 해결 후 'git add myfile'

  9. 그리고 지금 나는 붙어, 마스터로 다시 이동할 수 없습니다

내가 할 때

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

그리고 나는했다 :

$ git rebase --abort

리베이스가 진행되지 않습니까?

그리고 나는했다 :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

마스터 지점으로 돌아가려면 어떻게해야합니까?


충돌을 해결하고 추가를 수행 한 다음 커밋을 수행하려고 git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"하면 결과가 발생 fatal: cannot do a partial commit during a merge.합니다. 물론 "부분 커밋" 은 git man 페이지의 어느 곳에서나 문서화되거나 논의되지 않은 것으로 보입니다. git merge수정 후 후 수행 결과 Please, commit your changes before you can merge.엉덩이 도구 무엇입니까 ...
jww

2
명시 적 경로를 사용하는 git commit은 DESCRIPTION 페이지의 맨 페이지에 "3. 커밋 명령에 대한 인수로 파일을 나열함으로써 커밋은 인덱스에서 준비된 변경 사항을 무시하고 대신 파일의 현재 내용을 기록합니다 (이미 Git에 알려야 함); -only '옵션입니다. commit 명령의 작동 방식을 읽었다 고 가정 한 사람이 병합 메시지를 작성했으며 해당 설명에서 "부분"이라는 단어의 의미를 인식 할 수있을 것입니다. @jww
jthill

1
그렇다면 왜 그 사례 연구가 이해를 위해주의 깊게 읽을 가치가있는 반면 맨 페이지는 그렇지 않습니까? @jww
jthill

1
글쎄, git을 사용하려면 명확하게 읽을 준비가 된 것보다 더 나은 독해가 필요합니다. 아마도 그것이 당신이 확신하는 것보다 git의 결함인지 확실하지 않습니다.
jthill

1
Git 2.12 (2017 년 1 분기)를 사용하면 곧 git merge --continue. 아래 내 답변
VonC

답변:


267

병합하는 동안 충돌이 발생하면 병합 커밋을 수동으로 완료해야합니다. 처음 두 단계를 수행하여 충돌 한 파일을 편집 한 다음 해당 파일을 실행 git add하여 해결 된 것으로 표시하는 것처럼 들립니다 . 마지막으로와의 병합을 실제로 커밋해야합니다 git commit. 이때 지점을 다시 전환 할 수 있습니다.


커밋을 수행하기 위해 "git gui &"를 사용하면 브랜치 상태가 더 이상 "병합"되지 않는다는 것을 인식하지 못할 수 있습니다. "git status"를 추적하면 브랜치 상태가 올바른지 확인할 수 있습니다.
Tony Ashworth

4
시도 git commit -am "your commit message"추가를 수행하고 동시에 커밋.
8:24에

3
git commit작동합니다. 또한 기본 병합 커밋 메시지가 채워지도록하는 것이 가장 좋습니다. `git commit -am "은 메시지를 무시하기 때문에
피한다

1
시도하십시오 git push.
alper

아래 시나리오 에서이 상황이 발생했습니다-> X 분기를 Y 분기와 병합했습니다. 그런 다음 지점 Y에서 잘못된 일을 깨달았으므로이를 수정 한 다음 Y 지점의 변경 사항을 "수정"합니다. 수정 git 때문에 새로운 커밋을 만들지 않았습니다. 그래서 X 분기를 업데이트 된 Y 분기와 병합하면 충돌이 발생했습니다. 이 답변에 대한 BTW 감사합니다.
doga

157

병합 충돌을 해결 한 후 병합을 어떻게 완료합니까?

Git 2.12 (2017 년 1 분기)를 사용하면보다 자연스러운 명령을 얻을 수 있습니다.

git merge --continue

Jeff King ( )의 commit c7d227d (2016 년 12 월 15 일)를 참조하십시오 . 참조 042e290 커밋 , c261a87 커밋 , 367ff69 커밋 에 의해 (2016 12월 14일) 크리스 팩햄을 ( ) . ( Junio ​​C Hamano의해 병합 -- 커밋 05f6e1b , 2016 년 12 월 27 일)peff
cpackham
gitster

2.12 릴리스 정보를 참조하십시오 .

merge'추가 --continue'의 동의어로 옵션을 ' git commit'

병합을 완료하여 '계속'할 수 git merge있는 --continue옵션을 ' ' 가르쳐 주십시오.
충돌을 해결 한 후 병합을 완료하는 전통적인 방법은 ' git commit' 를 사용하는 것입니다.
이제 git rebase' git cherry-pick'에 ' --continue'옵션을 추가 하는 ' '옵션 이있는 ' '및 ' ' 같은 명령을 사용 git merge하면 일관된 UI가 표시됩니다.


2017 년 1 분기에 2.12에 최근에 추가 된 방법에 대한 의견을 게시 할 준비가되었지만 답변의 첫 번째 줄을 다시 읽었습니다. 버전 2.10에서 옵션을 찾을 수 없었습니다.
cjsimon

1
git merge --continue를 시도했지만 Git Bash는 이것을 명령으로 인식하지 못했습니다. 그러나 작동했던 것은 git commit -m "Commit message"
Mimi

2
@ Mimi OK,하지만 Git 2.12 이상을 사용하고 있습니까?
VonC

@VonC 당신이 맞습니다, 나는 이전 버전의 Git을 사용하고 있습니다!
Mimi

23

병합 / 리베이스 중에 멈춘 경우 언제든지

git reset --hard

작업을 마지막 커밋 상태로 복원합니다. 이것은 작업 트리에서 변경 사항을 잃게되므로 병합하기 전에 로컬 수정이 있었으면이 후에 사라질 것이므로 로컬 수정이있을 때 병합을 시작하지 않는 것이 좋습니다. :)


16
의무 경고 : git reset --hard멀리 않은 변경을 던져
제프리 헤일에게

2
git merge --abort아무것도 잃어 버릴 위험이 없는가?
Alexander George

11

그냥 git commit그것.

선택적으로 git abort그것은
병합 충돌에 부딪쳤다. 병합을 중단하려면 어떻게해야합니까?

kdiff3을 설치하고 mergetool로 구성하면 병합 작업을보다 쉽게 ​​수행 할 수 있습니다. 지침 : http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

해당 페이지에는 다음 비디오가 포함됩니다 : https://www.youtube.com/watch?v=Cc4xPp7Iuzo


11

command를 사용하여 두 개의 브랜치를 병합 할 때마다 두 가지 git merge brancha branchb가능성이 있습니다.

  1. 커밋 히스토리에 따라 다른 브랜치 (branch라고하는 브랜치)에 의해 하나의 브랜치 (brancha)가 도달 할 수 있습니다.

    그러나 두 지점이 이전 지점에서 분기 된 경우 git은 새 스냅 샷을 만들고 해당 지점을 가리키는 새로운 커밋을 추가합니다. 따라서 병합하는 분기 사이에 충돌이 없으면 git은 새 커밋을 부드럽게 만듭니다.

git log충돌하지 않는 두 개의 분기를 병합 한 후 커밋을 보려면 실행 하십시오.

이제 병합 지점간에 병합 충돌이 발생하면 흥미로운 사례로 돌아갑니다. 나는 https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging 페이지에서 이것을 인용한다.

힘내 새 병합 커밋을 자동으로 만들지 않았습니다. 충돌을 해결하는 동안 프로세스를 일시 중지했습니다. 병합 충돌 후 어느 시점에서 어떤 파일이 병합 해제되는지 확인하려면 다음을 실행할 수 있습니다.git status


따라서 병합 충돌이있는 경우 충돌을 해결 한 다음 사용하여 준비 영역에 변경 사항을 추가 한 다음 충돌로 인해 git에 의해 일시 중지 된 git add filename명령 git commit을 사용하여 변경 사항을 커밋 해야합니다. 질문. 자세한 내용은 위의 링크를 방문하십시오. 문의 사항이 있으시면 아래에 의견을 보내 주시면 기꺼이 도와 드리겠습니다.


7

충돌을 수동으로 해결 한 후 다음 단계는 다음과 같습니다.

  1. git add.
  2. git status (자동 병합 절차를 계속하는 데 필요한 명령이 표시됩니다)
  3. [명령 자식 알 예 git merge --continue, git cherry-pick --continue, git rebase --continue]

16
어떤 자식 병합 --continue가 없습니다
안녕 간장 에듀 펠리 즈 Navidad입니다

@HolaSoyEduFelizNavidad 이것은 올바르지 않습니다. 충돌 후 error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Zie

5
REBASE --continue가있다, --continue을 병합하지
안녕 간장 에듀 펠리 즈 Navidad입니다

git merge --continue, 내가하려고하는 결과는 error: unknown option 'continue'입니다. git-merge맨 페이지에 나열되지 않았기 때문에 귀하의 답변이 잘못되었다고 확신합니다 . 어떤 버전의 Git을 사용하고 있습니까? 사용하고 git version 1.8.5.2 (Apple Git-48)있습니다. 나는 또한 MacPorts 시도했다 git version 2.9.3.
jww

1
간단한 병합 자식 2.10로 명령이 평범한 구식입니다git commit
크리스 Charabaruk

2

병합하려는 두 분기가 동일한 파일의 동일한 부분을 변경 한 경우 병합 충돌이 발생합니다. 와 충돌 목록을 생성 할 수 있습니다 git status.

충돌하는 줄이 발견되면 Git은 충돌하는 내용의 양쪽을 표시하는 시각적 표시기로 영향을받는 파일의 내용을 편집합니다.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

충돌 한 파일을 수정하고 병합 할 준비가되면 실행 git add하고 git commit병합 커밋을 생성하기 만하면됩니다. 커밋이 완료되면 git push지점이 변경됩니다.

참조 기사 : Git merge .


2

모든 파일이 추가 된 후 다음 단계는 " git commit "입니다.

"git status"는 수행 할 작업을 제안합니다. 아직 추가하지 않은 파일은 맨 아래에 나열되고, 모두 완료되면 맨 위에 커밋을 제안하고 현재 분기의 병합 상태를 설명합니다.


1

내가 분명히하고 싶은 것은 브랜치 이름이 특정 커밋의 별칭 일뿐입니다. 커밋은 git이 작동하는 것입니다. 각 커밋에는 고유 한 ID가 있습니다.

$ git merge 할 때 실제로 일어나는 일은 git이 현재 분기를 참조 분기가있는 커밋으로 빨리 전달하려고 시도합니다 (즉, 두 분기 이름이 동일한 커밋을 가리킴).이 시나리오는 git에 가장 쉽습니다. 새로운 커밋이 없기 때문에 처리해야합니다. 지점이 식고있는 lilipad로 뛰어 오르는 마스터를 생각해보십시오. --no-ff 플래그를 설정할 수 있습니다.이 경우 git은 코드 충돌 여부에 관계없이 새 커밋을 만듭니다.

병합하려는 두 브랜치 (일반적으로 커밋 히스토리가 과거에 공통 커밋을 공유하는 두 개의 브랜치)간에 코드 충돌이있는 경우 빨리 감기가 작동하지 않습니다. 충돌하는 파일의 두 가지에 의해 동일한 줄이 변경되지 않는 한 git은 파일을 자동으로 병합 할 수 있습니다. 이 경우 git은 충돌하는 파일을 병합하여 자동으로 커밋합니다. $ git diff --cached를 수행하여 git의 수행 방식을 미리 볼 수 있습니다. 또는 --no-commit 플래그를 merge 명령에 전달하면 추가 및 커밋해야하는 색인에 수정 된 파일이 남습니다. 그러나 이러한 파일을 $ git diff하여 병합이 어떻게 변경되는지 검토 할 수 있습니다.

세 번째 시나리오는 git이 자동으로 해결할 수없는 충돌이있는 경우입니다. 이 경우 수동으로 병합해야합니다. 내 의견으로는 이것은 araxis merge 또는 p4merge (무료)와 같은 병합을 수행하는 것이 가장 쉽습니다. 어느 쪽이든, 각 파일을 하나씩 수행해야합니다. 만약 머지가 멈춘 것처럼 보인다면 $ git merge --continue를 사용하여 머지하십시오. 힘내는 그것이 계속 될 수 없는지 아닌지 말해 준다. 어떤 시점에서 병합을 크게 느낀다면 $ git merge --abort를 수행 할 수 있으며 병합이 취소되고 다시 시작할 수 있습니다. 완료되면 병합 한 각 파일은 추가 및 커밋해야하는 수정 된 파일이됩니다. $ git 상태의 파일 위치를 확인할 수 있습니다. 아직 병합 된 파일을 커밋하지 않은 경우 병합을 완료하려면이를 수행해야합니다.


0

늦었을 수 있습니다. git HEAD가 업데이트되지 않았기 때문에 발생합니다. 이 칭찬은 그것을 해결할 것입니다 git reset HEAD.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.