병합 충돌이 발생했습니다. 병합을 중단하려면 어떻게해야합니까?


2537

나는 git pull병합 충돌을 사용 하고 있었다 :

unmerged:   _widget.html.erb

You are in the middle of a conflicted merge.

나는 파일의 다른 버전이 좋고 내 것이 나쁘다는 것을 알고 모든 변경 사항을 버려야합니다. 어떻게해야합니까?


30
나는 이것이 오래된 질문이라는 것을 알고 있지만 전체 병합 을 중단하고 병합 하려는 지점을 병합하지 않은 상태로 두거나 더 큰 병합의 일부로이 파일을 무시하고 다른 모든 파일을 다음과 같이 병합합니다. 표준? 나에게, 당신의 제목은 전자를 의미하고, 당신의 질문 본문은 후자를 원합니다. 대답은 명확하게하지 않고 두 가지를 모두 수행합니다.
rjmunro

커밋에 대해 자동 병합이 실패했다는 비슷한 사례가 있습니다. 충돌을 수정하고 결과를 커밋 :[rejected] gh-pages -> gh-pages (non-fast-forward)
Chetabahana

4
Gwyn, 여기에서 허용되는 답변을 선택하는 것이 유용 할 수 있습니다. 가장 많이 투표 한 사람은 최신 솔루션 중 일부보다 안전하지 않으므로 다른 사람을 강조하는 데 도움이 될 것이라고 생각합니다. :)
Amicable

답변:


2219

당신 pull이 실패 했기 때문에 HEAD(아닌 HEAD^)는 지점에서 마지막 "유효한"커밋입니다.

git reset --hard HEAD

원하는 다른 것은 변경 사항이 변경 사항보다 우선하도록하는 것입니다.

이전 버전의 git에서는 "그들의"병합 전략을 사용할 수있었습니다.

git pull --strategy=theirs remote_branch

그러나 Junio ​​Hamano (Git 관리자) 가이 메시지 에서 설명한 대로이 기능 은 삭제되었습니다 . 링크 에서 언급했듯이 대신 다음을 수행하십시오.

git fetch origin
git reset --hard origin

49
하드 리셋을 수행하는 대신 다음을 수행하여 더 세밀한 수준으로 가져올 수 있습니다 git fetch origin .-> git reset origin (soft reset, your changes are still present) -> git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin) 더 이상 git pull을 사용하지 않습니다. 내 최신 코드를 원점 사이의 싸움 때문에 원점은 항상 내가 항상 승리해야 git fetch하고 git rebase origin. 이로 인해 실제로 병합과 충돌이 거의 없습니다.
Kzqai

7
동의한다. 또한 먼저 가져 와서 업스트림 변경 사항 ( git log ..@{upstream}또는 git diff ..@{upstream}) 을 조사하고 싶습니다 . 그 후, 당신처럼, 나는 나의 일을 리베이스 할 것입니다.
Pat Notz

162
더 최근의 대답에 언급 한 바와 같이, 버전 1.6.1, '자식 리셋 --merge'사용할 수 있습니다
매트 볼

5
내가 사용하는 git merge -X theirs remote_branch대신에 git pull --strategy=theirs remote_branchtheirs의 옵션 같은 외모recursive
MLT

14
git merge --abort훨씬 바람직하다.
다니엘 캐시디

1956

자식 버전이> = 1.6.1이면을 사용할 수 있습니다 git reset --merge.

또한 @Michael Johnson이 언급했듯이 git 버전이> = 1.7.4이면을 사용할 수도 있습니다 git merge --abort.

항상 그렇듯이 병합을 시작하기 전에 커밋되지 않은 변경 사항이 없는지 확인하십시오.

로부터 자식 병합 man 페이지

git merge --abortgit reset --merge있을 때 와 같습니다 MERGE_HEAD.

MERGE_HEAD 병합이 진행 중일 때 나타납니다.

또한 병합을 시작할 때 커밋되지 않은 변경 사항과 관련하여 :

병합을 시작하기 전에 커밋하지 않으려는 변경 사항이있는 git stash경우 병합하기 전과 병합 git stash pop을 마치거나 중단 한 후에 만 변경 사항을 적용 하십시오.


3
흥미롭지 만 매뉴얼이 무섭습니다. 언제 사용하는 것이 적절합니까? 언제 옵션을 지정해야 <commit>합니까? #GitMoment : -o
conny

1
일반적으로 처음부터 병합을 다시 실행하려고 할 때 이것을 사용합니다. 선택적 커밋을 직접 지정할 필요가 없으므로 기본값 (선택적 <commit> 없음)이 좋습니다.
Carl

44
이 답변에 더 많은 투표가 있었기를 바랍니다! 이 시점에서 많은 경우에 가장 적절한 솔루션 인 것 같습니다.
Jay Taylor

1
커밋되지 않은 변경 사항이 있어도 git은 병합 전에 상태를 복원 할 수있었습니다. 좋은!
T3rm1 2016 년

2
git merge --abort단지 동의어 git reset --merge? 그 이름은 확실히 더 의미가 있지만 같은 기능을 가지고 있습니까?
Tikhon Jelvis

518
git merge --abort

현재 충돌 해결 프로세스를 중단하고 병합 전 상태를 재구성하십시오.

병합이 시작될 때 커밋되지 않은 작업 트리 변경 git merge --abort이있는 경우 이러한 변경을 재구성 할 수없는 경우가 있습니다. 따라서 git merge를 실행하기 전에 항상 변경 사항을 커밋하거나 숨기는 것이 좋습니다.

git merge --abortgit reset --merge있을 때 와 같습니다 MERGE_HEAD.

http://www.git-scm.com/docs/git-merge


16
이것은 git v1.7.4부터 사용 가능합니다. git reset --merge의 별칭입니다.
마이클 존슨

162

너무 간단합니다.

git merge --abort

Git 자체는 이러한 유형의 문제가 발생했을 때 해결책을 보여주고 git status 명령을 실행합니다.

git status

이것이 사람들을 도울 수 있기를 바랍니다.


97

git reset당신이 필요 하다고 생각 합니다.

그주의 git revert, 말하자면, 매우 다른 수단 뭔가 svn revert반면 서브 버전으로 되돌리기 저장소에서 현재 버전으로 파일을 반환하여 (커밋되지 않은) 변경 사항을 취소합니다, - git revert"상태 해제"커밋합니다.

git reset와 같은 작업을 수행해야합니다 svn revert. 즉, 원하지 않는 변경 사항을 삭제해야합니다.


76

이 특정 유스 케이스에서는 병합을 중단하고 싶지 않고 특정 방식으로 충돌을 해결하기 만하면됩니다.

다른 전략으로 병합을 재설정하고 수행 할 필요가 없습니다. 충돌은 git에 의해 올바르게 강조 표시되었으며 다른 측면 변경 사항을 수락 해야하는 요구 사항은이 파일에만 해당됩니다.

충돌에서 병합되지 않은 파일의 경우 git은 색인에서 파일의 공통 기본, 로컬 및 원격 버전을 사용할 수있게합니다. (이것은 by by 3 방향 diff 도구에서 사용하기 위해 읽은 곳 git mergetool입니다.) git show이를 사용 하여 볼 수 있습니다.

# common base:
git show :1:_widget.html.erb

# 'ours'
git show :2:_widget.html.erb

# 'theirs'
git show :3:_widget.html.erb

원격 버전을 그대로 사용하기 위해 충돌을 해결하는 가장 간단한 방법은 다음과 같습니다.

git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb

또는 git> = 1.6.1 인 경우 :

git checkout --theirs _widget.html.erb

5
힌트 주셔서 감사합니다. 그래도 git 사용자 인터페이스가 열악하지 않습니까?
피터

@ 피터 : 나는 확신하지 않습니다. 간단한 옵션을 가진 몇 가지 기본 명령으로 원하는 결과를 얻을 수 있습니다. 어떤 개선을 제안 하시겠습니까?
CB Bailey

10
나는 그 git 1.6.1명령이 많은 의미가 있고 좋다고 생각합니다 . 그것이 바로 내가 원했던 것입니다. 1.6.1 이전의 솔루션은 우아하지 않으며 병합 해결 프로세스와 분리 해야하는 git의 다른 부분에 대한 지식이 필요하다고 생각합니다. 그러나 새 버전은 훌륭합니다!
피터

67

같은 시나리오 내가 그랬어 git fetchgit pull다음의 상류 지점 원치 않는 분쟁의 결과 마스터 지점이 아닌 것을 깨달았다.

git reset --merge 

로컬 변경 사항을 재설정하지 않고 되돌 렸습니다.


45

의견 git reset --merge은에 대한 별칭입니다 git merge --abort. a 가 존재 하는 git merge --abort경우에만 동등한 것을 주목할 가치 가 있습니다. 이것은 git help for merge 명령에서 읽을 수 있습니다.git reset --mergeMERGE_HEAD

git merge --abort는 MERGE_HEAD가있을 때 git reset --merge와 같습니다.

실패한 병합 후가 없으면 MERGE_HEAD실패한 병합을 취소 할 수 git reset --merge있지만 반드시 그런 것은 아닙니다 git merge --abort. 그것들은 같은 것에 대한 오래된 구문과 새로운 구문 만이 아닙니다 .

개인적으로, 나는 git reset --merge설명 된 시나리오와 비슷한 시나리오에서 훨씬 더 강력하고 일반적으로 병합에 실패했습니다.


2
실제로 "실패한 병합"이란 무엇입니까? 갈등이나 다른 것과 합병? 또는 다시 말하면 : MERGE_HEAD는 언제 존재하지 않습니까? 내 후속 질문은 "git reset --merge"의 더 나은 사용법을 이해하는 것입니다.
Ewoks

@Ewoks git stash apply는 병합 충돌을 일으켰지 만 git merge --abort그 동안 도움이되지 git reset --merge않았습니다.
nitzel

27

병합 충돌로 끝나고 커밋 할 것이 없지만 여전히 병합 오류가 표시됩니다. 아래 언급 된 모든 명령을 적용한 후

git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin

제거하십시오

.git \ index.lock

[복구시 다른 위치에 붙여 넣기 잘라 내기]를 선택한 다음 원하는 버전에 따라 아래 명령 중 하나를 입력하십시오.

git reset --hard HEAD
git reset --hard origin

희망이 도움이됩니다 !!!


19

작업 복사본의 상태를 유지하는 대안은 다음과 같습니다.

git stash
git merge --abort
git stash pop

필자는 일반적으로 다음 커밋에서 브랜치 관계를 버릴 때 Subversion에서 병합하는 것과 비슷하기 때문에 이것을 반대합니다.


실수로 git-svn 브랜치에 합병했을 때이 접근법이 유용하다는 것을 알았습니다. git-svn 추적 브랜치로 작업 할 때 스쿼시 병합 또는 체리 픽이 더 좋습니다. 실제로 내 솔루션은 사실 후에 병합을 스쿼시 병합으로 바꿉니다.
Alain O'Dea

질문에 대한 최고의 답변
Fouad Boukredine의 1


3

다음이 저에게 효과적이라는 것을 알았습니다 (단일 파일을 사전 병합 상태로 되돌리기).

git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*

-5

소스 트리

병합을 커밋하지 않기 때문에 다른 브랜치를 두 번 클릭하면됩니다 (체크 아웃을 의미 함). 소스 트리에서 모든 변경 사항을 취소하는 것에 대해 묻는다면 동의하십시오.)

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