나는 git pull
병합 충돌을 사용 하고 있었다 :
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
나는 파일의 다른 버전이 좋고 내 것이 나쁘다는 것을 알고 모든 변경 사항을 버려야합니다. 어떻게해야합니까?
[rejected] gh-pages -> gh-pages (non-fast-forward)
나는 git pull
병합 충돌을 사용 하고 있었다 :
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
나는 파일의 다른 버전이 좋고 내 것이 나쁘다는 것을 알고 모든 변경 사항을 버려야합니다. 어떻게해야합니까?
[rejected] gh-pages -> gh-pages (non-fast-forward)
답변:
당신 pull
이 실패 했기 때문에 HEAD
(아닌 HEAD^
)는 지점에서 마지막 "유효한"커밋입니다.
git reset --hard HEAD
원하는 다른 것은 변경 사항이 변경 사항보다 우선하도록하는 것입니다.
이전 버전의 git에서는 "그들의"병합 전략을 사용할 수있었습니다.
git pull --strategy=theirs remote_branch
그러나 Junio Hamano (Git 관리자) 가이 메시지 에서 설명한 대로이 기능 은 삭제되었습니다 . 링크 에서 언급했듯이 대신 다음을 수행하십시오.
git fetch origin
git reset --hard origin
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
. 이로 인해 실제로 병합과 충돌이 거의 없습니다.
git log ..@{upstream}
또는 git diff ..@{upstream}
) 을 조사하고 싶습니다 . 그 후, 당신처럼, 나는 나의 일을 리베이스 할 것입니다.
git merge -X theirs remote_branch
대신에 git pull --strategy=theirs remote_branch
로 theirs
의 옵션 같은 외모recursive
git merge --abort
훨씬 바람직하다.
자식 버전이> = 1.6.1이면을 사용할 수 있습니다 git reset --merge
.
또한 @Michael Johnson이 언급했듯이 git 버전이> = 1.7.4이면을 사용할 수도 있습니다 git merge --abort
.
항상 그렇듯이 병합을 시작하기 전에 커밋되지 않은 변경 사항이 없는지 확인하십시오.
로부터 자식 병합 man 페이지
git merge --abort
git reset --merge
있을 때 와 같습니다 MERGE_HEAD
.
MERGE_HEAD
병합이 진행 중일 때 나타납니다.
또한 병합을 시작할 때 커밋되지 않은 변경 사항과 관련하여 :
병합을 시작하기 전에 커밋하지 않으려는 변경 사항이있는 git stash
경우 병합하기 전과 병합 git stash pop
을 마치거나 중단 한 후에 만 변경 사항을 적용 하십시오.
<commit>
합니까? #GitMoment : -o
git merge --abort
단지 동의어 git reset --merge
? 그 이름은 확실히 더 의미가 있지만 같은 기능을 가지고 있습니까?
git merge --abort
현재 충돌 해결 프로세스를 중단하고 병합 전 상태를 재구성하십시오.
병합이 시작될 때 커밋되지 않은 작업 트리 변경
git merge --abort
이있는 경우 이러한 변경을 재구성 할 수없는 경우가 있습니다. 따라서 git merge를 실행하기 전에 항상 변경 사항을 커밋하거나 숨기는 것이 좋습니다.
git merge --abort
git reset --merge
있을 때 와 같습니다MERGE_HEAD
.
git reset
당신이 필요 하다고 생각 합니다.
그주의 git revert
, 말하자면, 매우 다른 수단 뭔가 svn revert
반면 서브 버전으로 되돌리기 저장소에서 현재 버전으로 파일을 반환하여 (커밋되지 않은) 변경 사항을 취소합니다, - git revert
"상태 해제"커밋합니다.
git reset
와 같은 작업을 수행해야합니다 svn revert
. 즉, 원하지 않는 변경 사항을 삭제해야합니다.
이 특정 유스 케이스에서는 병합을 중단하고 싶지 않고 특정 방식으로 충돌을 해결하기 만하면됩니다.
다른 전략으로 병합을 재설정하고 수행 할 필요가 없습니다. 충돌은 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
git 1.6.1
명령이 많은 의미가 있고 좋다고 생각합니다 . 그것이 바로 내가 원했던 것입니다. 1.6.1 이전의 솔루션은 우아하지 않으며 병합 해결 프로세스와 분리 해야하는 git의 다른 부분에 대한 지식이 필요하다고 생각합니다. 그러나 새 버전은 훌륭합니다!
의견 git reset --merge
은에 대한 별칭입니다 git merge --abort
. a 가 존재 하는 git merge --abort
경우에만 동등한 것을 주목할 가치 가 있습니다. 이것은 git help for merge 명령에서 읽을 수 있습니다.git reset --merge
MERGE_HEAD
git merge --abort는 MERGE_HEAD가있을 때 git reset --merge와 같습니다.
실패한 병합 후가 없으면 MERGE_HEAD
실패한 병합을 취소 할 수 git reset --merge
있지만 반드시 그런 것은 아닙니다 git merge --abort
. 그것들은 같은 것에 대한 오래된 구문과 새로운 구문 만이 아닙니다 .
개인적으로, 나는 git reset --merge
설명 된 시나리오와 비슷한 시나리오에서 훨씬 더 강력하고 일반적으로 병합에 실패했습니다.
git stash apply
는 병합 충돌을 일으켰지 만 git merge --abort
그 동안 도움이되지 git reset --merge
않았습니다.
병합 충돌로 끝나고 커밋 할 것이 없지만 여전히 병합 오류가 표시됩니다. 아래 언급 된 모든 명령을 적용한 후
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
희망이 도움이됩니다 !!!
작업 복사본의 상태를 유지하는 대안은 다음과 같습니다.
git stash
git merge --abort
git stash pop
필자는 일반적으로 다음 커밋에서 브랜치 관계를 버릴 때 Subversion에서 병합하는 것과 비슷하기 때문에 이것을 반대합니다.
Git 1.6.1.3부터 git checkout
병합의 양쪽에서 체크 아웃 할 수있었습니다.
git checkout --theirs _widget.html.erb
소스 트리
병합을 커밋하지 않기 때문에 다른 브랜치를 두 번 클릭하면됩니다 (체크 아웃을 의미 함). 소스 트리에서 모든 변경 사항을 취소하는 것에 대해 묻는다면 동의하십시오.)