아직 푸시되지 않은 Git 병합 실행 취소


3942

내 마스터 브랜치 내에서 git merge some-other-branch로컬로 수행했지만 변경 사항을 원래 마스터로 푸시하지 않았습니다. 병합을 의미하지 않았으므로 실행 취소하고 싶습니다. git status병합 후 작업을 수행 할 때이 메시지가 나타납니다.

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

내가 찾은 지침에 따라 달리기를 시도했습니다.

git revert HEAD -m 1

하지만 지금이 메시지가 나타납니다 git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

나는 커밋이 앞당겨지기를 원하지 않습니다. 그 시점으로 돌아가려면 어떻게해야합니까?


3
당신이 역사를 보존 해야하는 경우, 다시 말해 누군가가 당신에게서 가져온 변화가 있거나 당신이 어딘가에 밀어 넣었을 때 Yuri Ushakov의 해결책을 아래에서 사용하십시오!
Sedrik

6
현재 당첨 된 답변을 선택 해제하십시오. 여전히 많은 수의 지적 사항이 있지만 투표를 수집하는 것은 안전하지 않습니다. 나에게 "MBO"는 점수가 적지 만 가장 잘 보입니다.
inger



3
이것은 바로 Github에서에서 좋은 자원 : 힘내과 (거의) 아무것도 실행 취소 방법
jasonleonhard

답변:


4455

함께 git reflog일 이전에 병합이 커밋 검사 ( git reflog보다 더 나은 옵션이 될 것입니다 git log). 그런 다음 다음을 사용하여 재설정 할 수 있습니다.

git reset --hard commit_sha

또 다른 방법이 있습니다.

git reset --hard HEAD~1

커밋 1을 돌려줍니다.

수정 및 커미트되지 않은 / 스 태치되지 않은 파일은 수정되지 않은 상태로 재설정됩니다 . 변경 사항을 숨기거나 아래 --merge옵션을 참조하십시오 .


@Velmont는 그의 대답에서 아래에 제안한 것처럼,이 직접적인 경우에는 다음을 사용합니다.

git reset --hard ORIG_HEAD

변경 사항을 보존해야하므로 더 나은 결과를 얻을 수 있습니다. ORIG_HEAD병합이 발생하기 직전에 커밋을 가리 키므로 직접 찾아 볼 필요가 없습니다.


추가 팁은 불필요하게 파일을 재설정하지 않기 때문에 --merge대신 스위치 를 사용하는 것입니다 --hard.

git reset --merge ORIG_HEAD

-병합

인덱스를 재설정하고 <commit>과 HEAD간에 다른 작업 트리의 파일을 업데이트하지만 인덱스와 작업 트리간에 다른 파일 (예 : 추가되지 않은 변경 사항)은 유지합니다.


129
나는 이것이 (항상?) 작동 할 것이라고 생각하지 않습니다- "하나의 병합"은 다른 지점에서 병합 된 가장 최근의 커밋이 될 것입니다-현재 브랜치에서 가장 최근의 커밋은 아닙니다 . 권리? (이것은 git log기본적으로 표시하도록 선택한 결과 일 수 있습니다 -아마도 다른 출력이 git log있거나 git reflog이것에 사용될 수 있습니다)
John Bachir

6
스쿼시 병합 여부에 달려 있다고 생각합니다.
Marcin Gil

29
@JohnBachir이 맞습니다. 에서 git log출력, 두 부모 커밋을보고 싶다. 하나는 지점의 최신 커밋이고 다른 하나는 병합 한 지점의 최신 커밋입니다. git reset --hard병합 한 브랜치에서 부모 커밋을 수행 하려고합니다 .
저스틴

7
@JohnBachir : "병합"이 실제로 빨리 진행되지 않는 한, 로그의 맨 위에 새 커밋이 생기고이 커밋에는 부모가 2 명 (또는 문어를 사용하는 경우 2 명 이상)이 있습니다. 병합). 이 하나의 병합 커밋을 제거하면 병합에서 나온 모든 이전 커밋도 사라집니다. 그러나 안전을 위해 재설정 후 git은 새 헤드의 위치를 ​​알려줍니다 : "HEAD is now 88a04de <commit message>". 나는 항상 내가 기대했던 곳을 끝내기 위해 그것을 보았습니다. 내 프로젝트는 표준 브랜치 명명 체계를 사용하여 기억에 남는 것을 유지합니다.
Mark E. Haase

44
내가 유용하다고 생각한 것은 "git reflog"를보고 마스터에서 한 마지막 커밋을 찾는 것이었다. 그렇다면git reset --hard <commit_sha>
Max Williams

1455

로컬 마스터가 원산지 / 마스터보다 앞서 있지 않다고 가정하면

git reset --hard origin/master

그런 다음 현지 master지점이와 동일하게 보입니다 origin/master.


71
@Carter 그것은 실제로 가장 좋은 대답이 아닙니다. 일부 커밋으로 병합 직전의 원산지 / 마스터가 로컬 마스터보다 앞서있을 수 있습니다.이 경우 원하는 결과를 얻지 못할 수 있습니다.
Dhruva Sagar

15
@ dhruva-sagar 네, 그러나 git이 당신이 뒤에 있다고 말하지 않고 가져 오지 않으면 괜찮습니다.
켈빈

3
감사! 원격 리포지토리가있는 경우에 적합합니다.
tomc

2
이 질문에 대한 완벽한 질문은 아닙니다. "가정"절을 참조하십시오. MBO의 대답은 실제로이 경우와 병합이 유일한 로컬 커밋이 아닌 경우를 다룹니다.
inger

2
다시 한번,이 경고 는 대답 자체에 들어갈 것입니다 : 항상 git history를 다시 쓰지 마십시오!
cregox

1175

Git 책의 4 장Linus Torvalds의 원본 게시물을 참조하십시오 .

병합 취소하려면 이미 밀렸다 :

git revert -m 1 commit_hash

Linus가 말한 것처럼 지점을 다시 커밋하는 경우 되돌리기를 되 돌리십시오.


10
@perfectionist 동의 :) 종류가 소원의 다른 question--이 대답을 마이그레이션 할 수있는 방법이 있었다 (아마도이?)
mikermcneil

되돌리기에 대한 자세한 내용 : 링크
assaqqaf

1
이 되돌리기가 작동했음을 확신하기 위해 git diff hash1 hash2를 수행 할 수 있습니다. 여기서 hash1은 커밋 된 되돌리기이고 hash2는 상태를 되돌리려 고하는 이전 커밋입니다. 출력 없음 == 성공! 가장 최근의 병합을 되돌리고 뒤로 작업하여 시작하여 여러 번 커밋을 롤백 할 수있었습니다. git diff 는 내가 원하는 상태로 끝났다는 것을 보여주었습니다.
Robert Sinton

6
이가 않습니다 하지 실제로 원래 포스터의 질문을 해결 . 원래 포스터는 이미 사용했습니다 git revert -m 1 <commit>. 문제는 그렇게했을 때 실수로 병합 한 내용이 지워지지 않고 아직 밀리지 않은 것입니다. 하드 리셋과 관련된 다른 답변은 원래 포스터의 문제에 더 좋습니다.

이것은 Github에서 제공하는 훌륭한 자료 입니다. Git으로 모든 것을 취소하는 방법
jasonleonhard

986

가장 간단한 명령이 누락 된 것은 이상합니다. 대부분의 답변은 효과가 있지만 방금 병합을 취소 하면 쉽고 안전한 방법입니다 .

git reset --merge ORIG_HEAD

심판 ORIG_HEAD은 합병 전의 원래 커밋을 가리 킵니다.

(이 --merge옵션은 병합과 관련이 없습니다. 마치 git reset --hard ORIG_HEAD커밋되지 않은 변경 사항을 건드리지 않기 때문에 마치 안전합니다.)


17
git reset --merge ORIG_HEAD그 이후로 작업 트리를 더럽힌 경우 해당 변경 사항을 유지합니다.
yingted

1
이것은 유일한 정답입니다 (나는 이것이 최선의 대답이라고 말하지는 않습니다-차이점에 유의하십시오). 마스터에서 t1, t3 및 t5에서 3 개의 커밋을 수행했다고 가정 해 봅시다. branch1에서 t2, t4 및 t6에서 3 개의 주석을 작성했다고 가정 해보십시오 (t1, t2, t3, t4, t5 및 t6이 시간 순서대로 가정). 비슷한 명령 git reset --hard HEAD~5은 HEAD 만 재설정합니다 (마스터 및 branch1에서 커밋을 제거 할 수 있음). --merge옵션 만을 제거합니다 merge.
Manu Manjunath

@Manu이 --merge옵션은 실제로 병합을 제거하지는 않으며 --hard잘 사용할 수도 있습니다. 여기에서 실마리가되는 참조 ORIG_HEAD이며, 그 시점에 서있는 곳으로 병합하기 전에 설정됩니다. :)
odinho-Velmont

@yingted "무엇보다 작업 트리를 더럽 히면 git reset --merge ORIG_HEAD는 이러한 변경 사항을 유지합니다." 병합 후 파일을 변경한다는 의미입니까? 어쨌든 나는 병합을 한 다음 갈등을 해결했습니다. 그러나 병합을 재설정 하고이 답변의 지시에 따라 수행했습니다. 모든 것이 정상이며 병합 후에 수행 한 변경 사항을 유지하지 못했습니다. 내 로컬 리포지는 병합하기 전의 위치와 비슷합니다.
Samitha Chathuranga

git reset --hard ORIG_HEAD명령은 완벽하게 작동했습니다. 로컬 git merge에서 실행 취소를 시도한 후 저장소를 변경하지 않았기 때문에 도움이되었을 수 있습니다 . 이 명령은 리포지토리의 상태를 병합 전의 상태로 다시 재설정하기 만하면됩니다. 좋은 팁 주셔서 감사합니다!
bluebinary 2012 년

391

최신 Git 버전에서는 아직 병합을 커밋하지 않았고 병합 충돌 이있는 경우 간단하게 수행 할 수 있습니다.

git merge --abort

보낸 사람 man git merge:

[이]는 병합으로 인해 충돌이 발생한 후에 만 ​​실행할 수 있습니다. git merge --abort병합 프로세스를 중단하고 병합 전 상태를 재구성하려고합니다.


8
그의 병합 (제목 참조)를 밀어 최선을 다하고 있지만, 그는 그가 병합의 중간에 여전히 경우에만 명령이 작동 합병 이미 한
JBoy

135

이전 커밋으로 재설정해야합니다. 이것은 작동해야합니다 :

git reset --hard HEAD^

또는 HEAD^^그 되돌리기 커밋을 되돌릴 수도 있습니다. 얼마나 많은 단계를 거쳐야할지 확실하지 않은 경우 언제든지 SHA 전체를 참조 할 수 있습니다.

문제가 있고 마스터 브랜치에 로컬 변경 사항이없는 경우로 재설정 할 수 있습니다 origin/master.


5
가장 좋은 답변 IMHO는 OP의 자체 (Q에서 경우처럼 보이는 1 단계로 가정) 및 randomguy3의 바로 가기를 통합합니다. ")
inger

4
@Inger와 @Konstantin의 논평자 인 이유는 무엇입니까? 내 답변을 만든 후에 여기에 왔으며 더 정확합니다. HEAD를 한 단계 올리는 것은 종종 잘못된 일이며, 실제로 얼마나 멀리 올라 가야 하는지를 세어야합니다. 힘내는 이미 ORIG_HEAD당신을 위해 설정 , 왜 그것을 사용하지 않습니까?
odinho-Velmont

로컬 변경 사항도 재설정합니까? #PleaseUpdate.
CoDe

이것은 나를 위해 완벽하게 작동하여 여기에 대한 답보다 절반 이상이 이해가됩니다.
Varda Elentári

HEAD ^는 HEAD 이전에 커밋과 동일합니까? 그리고 ^^ 두 커밋이 먼저입니까? 이것이 빨리 감기 병합과 함께 작동하지 않는 것 같아?
Marcus Leon

87

최근에, 나는 이것을 git reflog돕기 위해 사용 하고 있습니다. 이것은 단지 병합 JUST가 발생하고 컴퓨터에있는 경우에만 작동합니다.

git reflog 다음과 같은 것을 반환 할 수 있습니다 :

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

첫 번째 줄은 병합이 발생했음을 나타냅니다. 두 번째 줄은 병합 전의 시간입니다. 나는 단순히 git reset --hard 43b6032합치기 전에이 지점을 추적하고 계속 수행하도록 강요한다.


좋은 답변, 감사합니다! 병합을 취소해야했지만 다른 답변 reflog은 SHA를 가져 와서 제대로 작동시키는 데 사용하여 더 엉망이되었습니다 git reset.
Lankymart

51

현대 Git을 사용하면 다음을 수행 할 수 있습니다.

git merge --abort

이전 구문 :

git reset --merge

오래된 학교:

git reset --hard

그러나 실제로는 그것이 주어진 git merge --abort것과 동등한 것에 주목할 가치 가 있습니다. 이것은 병합 명령에 대한 Git 도움말에서 읽을 수 있습니다.git reset --mergeMERGE_HEAD

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

더있을 때 실패한 병합 한 후 MERGE_HEAD, 실패한 병합으로 취소 될 수 git reset --merge있지만 반드시 함께 git merge --abort, 그들은 같은 일에 대한 이전 및 새 구문뿐만 아니라 그래서 .

개인적으로 나는 git reset --merge일상 업무에서 훨씬 더 강력하고 유용하다는 것을 알기 때문에 항상 사용하는 것입니다.


나를 위해 일했다. 다른 모든 게시물은 이것이 너무 복잡하다고 말하지만, 이것은 정확히 예상 한 것입니다. 나는 그것이 원래의 질문에 정확하게 답하지 않는 갈등이 있었기 때문에 효과가 있다고 생각합니다.
Jeremy

이 답변은 OP의 상황에 초점을 맞추지 않으며 중요한 맥락을 생략합니다.
벤 휠러

37

좋아, 다른 사람들이 나에게 준 대답은 가깝지 만 작동하지 않았습니다. 여기 내가 한 일이 있습니다.

이 작업을 수행하는 중 ...

git reset --hard HEAD^
git status

... 다음 상태를 알려주세요.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

그런 다음 동일한 git reset명령을 여러 번 입력해야했습니다 . 내가 그렇게 할 때마다 아래에서 볼 수 있듯이 메시지가 하나씩 변경되었습니다.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

이 시점에서 상태 메시지가 변경된 것을 보았으므로을 시도했지만 git pull작동하는 것 같습니다.

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

짧은 이야기로, 내 명령은 다음과 같습니다.

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

19
또는 당신이 사용했을 수 있습니다HEAD^^^^
57 분

17
어쩌면 재설정 origin/master)
하센

23

git reflog이전 체크 아웃을 찾는 데 사용할 수 있습니다 . 때로는 다시 돌아가고 싶은 좋은 상태입니다.

구체적으로,

$ git reflog
$ git reset --hard HEAD@{0}

1
감사합니다! 당신은 내 일의 반나절을 절약했습니다. 그러나 명령으로 reflog 모드를 종료 할 수 없습니다.
카타르지나

1
reflog 종료에 "Q"키를 사용 @Katarzyna
Amjed 베이 그

21

병합하는 중이라면 언제든지 중단 할 수 있습니다 git merge --abort


2
고마워 친구와 나는 그 무서운 물건 정답을하려고했다. 운이 좋은 나는 아래로 스크롤했다. 난 그냥 병합 헤드를 삭제하고 싶어
Nyuu

15

커밋 ID를 조회하지 않는 단일 명령 으로이 문제를 해결할 수있었습니다.

git reset --hard remotes/origin/HEAD

허용 된 답변이 저에게 효과가 없었지만이 명령은 내가 찾고있는 결과를 얻었습니다.


바로 그거죠! 브랜치의 HEAD로 변경 사항을 재설정합니다! 하나씩 수행하지 않음
Carlos Zinato

나를 위해 일하지 않았다. 실제로 1 ~ 2 개월 동안 지역 지점을 다시 보냈습니다. 고맙게도 이것은 모두 로컬이므로 항상 분기를 파괴하고 다시 가져올 수 있습니다. 다른 사람들이 이것을 시도했을 때를 지적하고 싶었습니다.
Matt Pengelly 2016 년

@MattPengelly이 방법은 대부분 문서화되지 않았으며 병합을 수행하기 전에 지점이 원격 지점과 동기화되어있는 경우 일반적으로 작동합니다. 지점이 원격 지점과 동기화 된 지 몇 달이 지났습니까?
랄프 리 토치

@MattPengelly 그것은 또한 HEAD가 가리키는 지점에 달려 있습니다. 내 프로젝트 중 하나에서 gitflow를 사용하고 있으며 개발 브랜치에 있더라도 remotes / origin / HEAD는 origin / master를 가리 키므로 병합을 취소 해야하는 경우 아마도 원격으로 재설정해야합니다 / origin / develop
Ralph Ritoch 2018

14

아직 커밋하지 않은 경우에만 사용할 수 있습니다

$ git checkout -f

병합 (및 수행 한 모든 작업)을 취소합니다.


이것을 시도하고 실제로 내 지역 지점보다 앞선 커밋 수를 늘 렸습니다.
barclay

14

이 질문으로 인해 원점과 일치하도록 되돌릴 수 있습니다 (즉, NO는 원점보다 앞선 커밋). 더 연구 한 결과 reset정확히 다음과 같은 명령 이 있음을 발견 했습니다.

git reset --hard @{u}

참고 :의 @{u}줄임말입니다 origin/master. (물론 이것이 작동하려면 원격 저장소가 필요합니다.)


14

물론 HEAD를 바꿔야합니다. 물론 git HEAD ....

대답하기 전에이 내용을 설명하는 배경을 추가해 보겠습니다 HEAD.

First of all what is HEAD?

HEAD단순히 현재 분기의 현재 커밋 (최신)에 대한 참조입니다. 주어진 시간에
하나만있을 수 있습니다 HEAD. (제외 git worktree)

내용은 HEAD내부에 저장 .git/HEAD되며 현재 커밋의 40 바이트 SHA-1을 포함합니다.


detached HEAD

최근 커밋-의미에 있지 않은 경우 HEAD기록에서 이전 커밋을 가리키고 detached HEAD있습니다.

여기에 이미지 설명을 입력하십시오

명령 행에서 분기 이름 대신 다음과 같이 표시됩니다 HEAD. 현재 분기의 끝을 가리 키지 않기 때문 입니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

분리 된 HEAD에서 복구하는 방법에 대한 몇 가지 옵션 :


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

원하는 커밋을 가리키는 새 분기를 체크 아웃합니다.
이 명령은 주어진 커밋을 체크 아웃합니다.
이 시점에서 지점을 만들고이 시점부터 작업을 시작할 수 있습니다.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

당신은 항상 사용할 수 있습니다 reflog.
git reflog변경 사항을 표시 HEAD하고 원하는 참조 로그 항목을 체크 아웃하면 HEAD이 커밋으로 다시 설정됩니다 .

HEAD가 수정 될 때마다 reflog

git reflog
git checkout HEAD@{...}

원하는 커밋으로 돌아갑니다.

여기에 이미지 설명을 입력하십시오


git reset --hard <commit_id>

HEAD를 원하는 커밋으로 "이동"하십시오.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • 참고 : ( Git 2.7 이후 )
    도 사용할 수 있습니다 git rebase --no-autostash.

git revert <sha-1>

지정된 커밋 또는 커밋 범위를 "실행 취소"합니다.
reset 명령은 지정된 커밋에서 변경 한 내용을 "실행 취소"합니다.
실행 취소 패치가 포함 된 새 커밋이 커밋되고 원래 커밋도 기록에 남아 있습니다.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

이 스키마는 어떤 명령이 무엇을 수행하는지 보여줍니다.
보시다시피을 reset && checkout수정하십시오 HEAD.

여기에 이미지 설명을 입력하십시오


이 🐱👤🐱👤🐱👤 보물
Jawand 싱

12

가장 간단한 답변은 odinho가 제공 한 답변입니다-Velmont

먼저 git reset --merge ORIG_HEAD

변경 사항을 푸시 한 후 재설정하려는 사람들은 이것을 수행하십시오 (이것은 git reset merge 질문에 대한 첫 번째 게시물이기 때문에)

git push origin HEAD --force

풀 후 병합 된 변경 사항을 다시 가져 오지 않는 방식으로 재설정됩니다.


10

: 추가 옵션을보고 그냥, 나는 주로 분기 모델은 여기에 설명 된 다음 봤는데 http://nvie.com/posts/a-successful-git-branching-model/을 하고 같은과 병합 된 --no-ff없음 ( 빨리 감기) 보통.

실수로 릴리스 브랜치 대신 테스트 브랜치를 배치하기 위해 마스터와 마스터 브랜치를 병합했기 때문에이 페이지를 읽었습니다 (웹 사이트, 마스터는 살아있는 것입니다). 테스트 지점에는 두 개의 다른 지점이 병합되어 있으며 총 약 6 개의 커밋이 있습니다.

전체 커밋을 되돌리려면 방금 하나만 필요 git reset --hard HEAD^했고 전체 병합을 되돌 렸습니다. 병합이 빨리 전달되지 않았기 때문에 병합은 블록이고 한 단계 뒤로 "분기 병합되지 않음"입니다.


10

두 가지 명령 만 사용하여 병합을 되돌 리거나 특정 커밋으로 다시 시작할 수 있습니다.

  1. git reset --hard commitHash (예 : 44a587491e32eafa1638aca7738과 같이 다시 시작하려는 커밋을 사용해야합니다)
  2. git push origin HEAD --force (새로운 로컬 마스터 지점을 출발지 / 마스터에게 보내기)

행운을 빌어 요!


10

여러 가지 방법으로 수행 할 수 있습니다.

1) 중단 병합

잘못된 병합 사이에 있고 (잘못 잘못된 분기로 수행됨) 병합이 다음과 같이 최신 지점으로 다시 돌아가는 것을 피하려는 경우 :

git merge --abort

2) HEAD를 원격 지점으로 재설정

원격 개발 브랜치에서 작업중인 경우 다음과 같이 HEAD를 원격 브랜치의 마지막 커밋으로 재설정 할 수 있습니다.

git reset --hard origin/develop

3) 현재 브랜치를 삭제하고 원격 저장소에서 다시 체크 아웃하십시오.

원격 / 개발 지점과 동기화되는 로컬 리포지토리에서 지점을 개발하고 있다고 생각하면 다음과 같이 할 수 있습니다.

git checkout master 
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :) 

git branch -D develop
git checkout -b develop origin/develop

"1) 중단 병합"은 꽤 충분했습니다. 공감.
CodeToLife

1
조심해! git merge --abort "병합이 충돌 한 후에 만 ​​실행될 수 있습니다. git merge --abort는 병합 프로세스를 중단하고 병합 전 상태를 재구성하려고 시도합니다"
Pedro García Medina

8

병합 및 해당 커밋이 아직 푸시되지 않은 경우 언제든지 다른 브랜치로 전환하고 원래 브랜치를 삭제 한 다음 다시 만들 수 있습니다.

예를 들어, 실수로 개발 브랜치를 마스터로 병합하고 실행 취소하려고했습니다. 다음 단계를 사용하십시오.

git checkout develop
git branch -D master
git branch -t master origin/master

짜잔! 마스터는 원점과 같은 단계에 있으며 잘못 병합 된 상태는 지워집니다.


1
참고 : 이렇게하면 병합이 취소 될뿐만 아니라 최근에 푸시 한 이후의 로컬 커밋도 취소됩니다.
Martijn Heemels

4

커맨드 라인 솔루션을 원한다면 MBO의 대답을 따르십시오.

초보자라면 그래픽 방식이 마음에 듭니다.

  1. 킥오프 gitk(명령 줄에서 또는 파일 탐색기에서 마우스 오른쪽 버튼을 클릭)
  2. 거기에 병합 커밋을 쉽게 찾을 수 있습니다-두 부모가있는 맨 처음 노드
  3. 첫 번째 / 왼쪽 부모에 대한 링크를 따라 가십시오 (병합 전에 현재 지점에있는 부모 중 하나는 대개 빨간색)
  4. 선택한 커밋에서 "여기로 분기 재설정"을 마우스 오른쪽 단추로 클릭하고 하드 재설정을 선택하십시오.

4

전략 : 모든 것이 좋은 곳에서 새로운 지점을 만듭니다.

근거 : 병합을 되 돌리는 것은 어렵다. 병합을 커밋했는지 또는 푸시했는지 또는 병합 이후 새로운 커밋이 있는지 여부와 같은 많은 요인에 따라 솔루션이 너무 많습니다. 또한 이러한 솔루션을 사례에 맞게 조정하려면 git에 대해 비교적 깊이 이해해야합니다. 맹목적으로 몇 가지 지침을 따르면, 아무것도 병합되지 않는 "빈 병합"으로 끝날 수 있으며, 추가 병합 시도로 인해 Git이 "이미 최신 상태"라고 알려줍니다.

해결책:

하자가 병합 할 말 devfeature-1.

  1. 병합을 받으려는 개정을 찾으십시오.

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. 그것을 확인하십시오 (시간으로 되돌아 가십시오) :

    git checkout e5f6g7h8
    
  3. 거기에서 새 브랜치를 만들고 체크 아웃하십시오.

    git checkout -b feature-1
    

이제 병합을 다시 시작할 수 있습니다 :

  1. 병합 : git merge dev

  2. 병합 충돌을 해결하십시오.

  3. 범하다: git commit

  4. 결과에 만족하면 이전 분기를 삭제하십시오. git branch --delete feature-1


2

새로운 브랜치를 만들고 나서 원하는 커밋을 선택하십시오.

절약되고 간단하며 위의 많은 답변에서 설명한 재설정


1
특히 제안 된 git 명령에 완전히 익숙하지 않은 경우이 제안에 동의합니다. "수고"가 많을수록 속도가 느려질 수 있지만 많이 나오지 않고 작업 손실에 관심이 있다면 노력할 가치가 있습니다.
그렉

1

나는 당신이 되감기를 원하지만 다시 하나의 되감기를 원한다면 더 많은 것을 원하지 않는 편집기에서 커밋에 대한 줄을 삭제하고 멀리 다시 식별 해시를 git rebase -i [hash] [branch_name] 어디에서 할 수 있다고 생각합니다. [hash]. 파일을 저장하십시오. 출구. 빌다. 그리고 다시 감아 야합니다. 을해야 할 수도 git reset --hard있지만이 시점에서 좋을 것입니다. 히스토리에 보관하지 않으려는 경우 특정 커밋을 스택에서 가져 오기 위해 저장소를 사용할 수도 있지만 원하지 않는 상태로 저장소를 남길 수 있습니다.


1

병합을 커밋 한 경우 :

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard

1
  1. 먼저 모든 것을 커밋했는지 확인하십시오.

  2. 그런 다음 저장소를 이전 작업 상태로 재설정하십시오.

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    또는 사용 --hard( 커밋되지 않은 모든 로컬 변경 사항을 제거합니다! ) :

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    잘못 병합 된 커밋 전에 있던 해시를 사용하십시오.

  3. 이전 올바른 버전의 맨 위에 어떤 커밋을 다시 커밋 할 것인지 확인하십시오.

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. 올바른 버전의 저장소 위에 올바른 커밋을 적용하십시오.

    • cherry-pick (기존 커밋이 도입 한 변경 사항) 사용

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • 또는 다음과 같이 커밋 범위를 체리 따기 :

      • 올바른 변경 사항을 병합하기 전에 먼저 확인하십시오.

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • 올바른 변경 사항을 병합하기 전에 먼저 확인하십시오.

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        여기서 이것은 커밋 한 올바른 커밋 범위입니다 (잘못 커밋 된 병합 제외).


1
  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

이것은 나를 위해 일했다 .. !!


0

병합 후 즉시 되돌려 야하고 병합 시도 후 다른 작업을 수행하지 않은 경우 다음 명령을 실행하면 git reset --hard HEAD@{1}됩니다.

기본적으로 병합가 sha가리키는 것 HEAD@{0}아무것도가 병합 후 최선을 다하고되지 않은 경우 등 HEAD@{1}병합하기 전에 이전의 포인트가 될 것입니다.


0

가장 간단한 기회 중 가장 간단하며 여기에 언급 된 것보다 훨씬 간단합니다.

로컬 지점 (원격이 아닌 로컬)을 제거하고 다시 당기십시오. 이런 식으로 마스터 브랜치에서 변경 사항을 취소하면 푸시하지 않으려는 변경 사항에 영향을받는 사람이 있습니다. 다시 시작해


0

이 경우으로 지점을 재설정하려고합니다 git reset --hard <branch_name>. 재설정하기 전에 변경 사항을 저장하려면 새 분기를 작성하십시오 git checkout <branch_name>.

상태를 특정 커밋으로 재설정 할 수도 git reset --hard <commit_id>있습니다.

변경 사항을 적용한 경우 git revert <branch_name>대신 사용할 수 있습니다 . 다른 시나리오에서도 git revert 및 git checkout 사용 방법을 확인하십시오 .

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