etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 10. 1. 03:19
반응형

질문자 :Matt Huggins


내 마스터 브랜치 내에서 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.

내 지점이 커밋 수보다 앞서는 것을 원하지 않습니다. 어떻게 해야 그 시점으로 돌아갈 수 있습니까?



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 는 병합이 발생하기 직전에 커밋을 가리키므로 직접 찾을 필요가 없습니다.


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

 git reset --merge ORIG_HEAD

--병합

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


Marcin Gil

로컬 마스터가 원산지/마스터보다 앞서 있지 않다고 가정하면 다음을 수행할 수 있어야 합니다.

 git reset --hard origin/master

그러면 로컬 master origin/master 동일하게 보일 것입니다.


randomguy3

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

이미 푸시 된 병합을 취소하려면 다음을 수행하십시오.

 git revert -m 1 commit_hash

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


Yuri Geinish

가장 간단한 명령이 누락된 것이 이상합니다. 대부분의 답변이 작동하지만 방금 수행한 병합을 취소하는 것이 쉽고 안전한 방법입니다 .

 git reset --merge ORIG_HEAD

ref ORIG_HEAD 는 병합 전의 원래 커밋을 가리킵니다.

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


odinho - Velmont

최신 Git 버전에서 아직 병합을 커밋하지 않았고 병합 충돌이 있는 경우 다음을 수행하면 됩니다.

 git merge --abort

man git merge :

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


Travis Reeder

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

 git reset --hard HEAD^

또는 HEAD^^ 를 사용하여 되돌리기 커밋을 되돌립니다. 몇 걸음 뒤로 물러나야 하는지 잘 모르겠다면 언제든지 전체 SHA 참조를 제공할 수 있습니다.

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


MBO

최근에는 git reflog 를 사용하고 있습니다. 이것은 병합이 방금 발생하고 컴퓨터에 있었던 경우에만 대부분 작동합니다.

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 이 분기가 병합 이전부터 계속 추적되도록 합니다.


Parris

최신 Git을 사용하면 다음을 수행할 수 있습니다.

 git merge --abort

이전 구문:

 git reset --merge

오래된 학교:

 git reset --hard

그러나 실제로 git merge --abort 는 MERGE_HEAD가 있는 경우에만 git reset --merge --merge와 동일하다는 점에 MERGE_HEAD 가 있습니다. 이것은 병합 명령에 대한 Git 도움말에서 읽을 수 있습니다.

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

병합에 실패한 후 MERGE_HEAD git reset --merge --merge 를 사용하여 취소할 수 있지만 반드시 git merge --abort 를 사용하는 것은 아니므로 동일한 것에 대한 이전 및 새 구문일 뿐만 아닙니다 .

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


Martin G

좋아요, 여기 다른 사람들이 제게 준 답변은 비슷했지만 작동하지 않았습니다. 여기 내가 한 일이 있습니다.

이러고...

 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

Matt Huggins

병합 중이라면 언제든지 중단할 수 있습니다.

 git merge --abort

llioor

당신은 물론 당신의 것이 아니라 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 가 현재 분기의 끝을 가리키지 않기 때문에 분기 이름 대신 SHA-1과 같이 표시됩니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

분리된 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 를 업데이트한 변경 사항을 표시하고 원하는 reflog 항목을 체크아웃하면 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 수정합니다.

여기에 이미지 설명 입력


CodeWizard

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

구체적으로,

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

stephjang

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

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

Amit Kaneria

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

 git reset --hard remotes/origin/HEAD

수락 된 답변이 효과가 없었지만이 명령은 내가 찾던 결과를 얻었습니다.


Ralph Ritoch

분기가 병합되고 푸시되지 않으면 아래에 제공된 git reset 명령이 병합을 취소하는 데 작동합니다.

 git reset --merge ORIG_HEAD

bunny patel

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

 $ git checkout -f

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


Idealmind

이 질문에 대해서도 원본과 일치하도록 되돌리려고 합니다(즉, 원본보다 먼저 커밋하지 않음). 더 조사하면 정확히 다음과 reset 명령이 있음을 발견했습니다.

git reset --hard @{u}

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


leanne

가장 간단한 대답은 odinho-Velmont가 제공한 것입니다.

먼저 git reset --merge ORIG_HEAD

변경 사항을 푸시한 후 재설정하려는 경우 다음을 수행하십시오(이 게시물은 git reset 병합 질문에 대해 처음으로 본 게시물이기 때문입니다).

git push origin HEAD --force

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


Harsha

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

  1. git reset --hard commitHash (다시 시작하려는 커밋을 사용해야 합니다. 예: 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (새로운 로컬 마스터 브랜치를 오리진/마스터로 보내기)

행운을 빕니다.


Matheus Abreu

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

배포를 위해 내 릴리스 분기 대신 테스트 분기를 실수로 병합하여 이 페이지를 읽었습니다(웹사이트, 마스터는 라이브입니다). 테스트 분기에는 두 개의 다른 분기가 병합되어 있으며 총 약 6개의 커밋이 있습니다.

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


Damien Byrne

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

예를 들어, 실수로 개발 분기를 마스터에 병합했고 그 작업을 취소하고 싶었습니다. 다음 단계 사용:

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

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


Stephan

명령줄 솔루션을 원하면 MBO의 답변을 따르는 것이 좋습니다.

초보자라면 그래픽 접근 방식을 좋아할 것입니다.

  1. gitk (명령줄에서 또는 파일 브라우저가 있는 경우 마우스 오른쪽 버튼 클릭)
  2. 병합 커밋을 쉽게 찾을 수 있습니다. 맨 위에서 두 부모가 있는 첫 번째 노드입니다.
  3. 첫 번째/왼쪽 부모에 대한 링크를 따르십시오(병합 전 현재 분기에 있는 것, 일반적으로 저에게는 빨간색).
  4. 선택한 커밋에서 "Reset branch to here"를 마우스 오른쪽 버튼으로 클릭하고 하드 리셋을 선택하십시오.

inger

전략: 모든 것이 좋았던 곳에서 새로운 분기를 만듭니다.

근거: 병합을 되돌리는 것은 어렵습니다. 병합을 커밋했거나 푸시했는지 여부 또는 병합 이후에 새로운 커밋이 있었는지 여부와 같은 여러 요인에 따라 솔루션이 너무 많습니다. 또한 이러한 솔루션을 귀하의 사례에 적용하려면 여전히 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


pyb

git rebase -i [hash] [branch_name] 할 수 있다고 생각합니다. 여기서 [hash] 는 되감기를 원하는 만큼 뒤로 더하기 1(또는 얼마나 많은 커밋을 되돌리고 싶은지)에 대한 식별 해시입니다. 그런 다음 다음 행을 삭제합니다. 더 이상 원하지 않는 커밋을 편집기에서 제거합니다. 파일을 저장합니다. 출구. 기도하다. 그리고 되돌려야 합니다. git reset --hard 를 수행해야 할 수도 있지만 이 시점에서는 좋을 것입니다. 이 기능을 사용하여 특정 커밋을 스택에서 가져올 수도 있습니다. 이 커밋을 기록에 남기고 싶지는 않지만 그렇게 하면 리포지토리가 원하지 않는 상태가 될 수 있습니다.


tychoish

새 분기를 만든 다음 원하는 커밋을 선택하십시오.

위의 많은 답변에서 설명한 보호기 및 단순 재설정


gdbdable

"아직 푸시되지 않은 Git 병합 취소 " 질문에 답하기

git reset --hard HEAD~1 사용할 수 있습니다.

masterfeature-1 2개의 분기가 있는 다음 상황을 고려하십시오.


 $ git log --graph --oneline --all

Git 병합 수행

 $ git merge feature-1

 $ git log --graph --oneline --all

Git 병합 실행 취소

 $ git reset --hard HEAD~1

 $ git log --graph --oneline --all


blessed

병합을 커밋한 경우:

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

Dorian

  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

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


kenorb

  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

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


Siva Kumar

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

기본적으로 병합 후 다른 것이 커밋되지 않은 경우 sha HEAD@{0} 가리키 HEAD@{1} 는 병합 전의 이전 지점이 됩니다.


Daniel Dut

출처 : 여기를 클릭하세요


출처 : http:www.stackoverflow.com/questions/2389361/undo-a-git-merge-that-hasnt-been-pushed-yet

반응형