Git 撤消尚未';我还没被推

Git 撤消尚未';我还没被推,git,undo,git-merge,Git,Undo,Git Merge,在我的主分支中,我在本地执行了一个git合并其他分支,但从未将更改推送到originmaster。我不想合并,所以我想撤销它。在合并后执行git status时,我收到以下消息: # On branch master # Your branch is ahead of 'origin/master' by 4 commits. 根据一些情况,我试着跑步 git revert HEAD -m 1 但是现在我得到了一条带有git状态的消息: # On branch master # Your b

在我的主分支中,我在本地执行了一个git合并其他分支,但从未将更改推送到originmaster。我不想合并,所以我想撤销它。在合并后执行
git status
时,我收到以下消息:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
根据一些情况,我试着跑步

git revert HEAD -m 1
但是现在我得到了一条带有git状态的消息:

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

我不希望我的分支机构以任何数量的承诺领先。如何回到这一点?

您应该重置为上一次提交。这应该起作用:

git reset --hard HEAD^
或者甚至
HEAD^^
来恢复该恢复提交。如果您不确定应该后退多少步,您可以始终提供完整的SHA参考


如果您遇到问题,并且您的主分支没有任何本地更改,您可以使用
git reflog
重置为
origin/master

,检查合并之前的提交(
git reflog
将是比
git log
更好的选择)。然后,您可以使用以下方法重置它:

git reset --hard commit_sha
还有另一种方法:

git reset --hard HEAD~1
它会让你回来的

请注意,任何已修改和未提交/未刷新的文件都将重置为其未修改状态。若要保留更改,请隐藏更改或查看下面的
--merge
选项


正如@Velmont在其回答中所建议的,在本直接案例中,使用:

git reset --hard ORIG_HEAD
可能会产生更好的结果,因为它会保留您的更改
ORIG_HEAD
将在合并发生之前直接指向提交,因此您不必自己寻找它


另一个技巧是使用
--merge
开关而不是
--hard
,因为它不会不必要地重置文件:

git reset --merge ORIG_HEAD
--合并

重置索引并更新工作树中与HEAD不同的文件,但保留索引与工作树之间不同的文件(即具有未添加的更改)


好吧,这里的其他人给我的答案很接近,但没有用。这就是我所做的

这样做

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

我想你可以做
git-rebase-I[hash][branch\u name]
其中
[hash]
是你想倒回多远的地方加上一个(或者你想倒回多少个提交)的识别哈希,然后在编辑器中删除你不想再重复的提交行。保存文件。出口祈祷吧。它应该被重绕。您可能需要执行一个git重置--hard
,但在这一点上应该很好。如果您不想将特定提交保留在历史记录中,但这可能会使存储库处于您可能不希望的状态,您也可以使用此功能从堆栈中提取特定提交。

假设您的本地主服务器不在源服务器/主服务器之前,您应该可以这样做

git reset --hard origin/master
然后您的本地
master
分支应与
origin/master

相同,请参阅和

要撤消已推送的合并

git revert -m 1 commit_hash
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
git reset --merge ORIG_HEAD

如Linus所说,如果您再次提交分支,请务必还原还原。为了查看额外的选项,我主要遵循此处描述的分支模型:因此通常与
--no ff
(无快进)合并

我只是阅读了这个页面,因为我不小心将一个测试分支(而不是我的发布分支)与master合并以进行部署(网站,master是实时的)。测试分支有两个其他分支合并到它,总共有六个提交


因此,要恢复整个提交,我只需要一个git reset--hard HEAD ^,它恢复了整个合并。由于合并不是快进的,因此合并是一个块,后退一步是“分支未合并”。

如果合并和相应的提交尚未推送,则始终可以切换到另一个分支,删除原始分支并重新创建它

例如,我意外地将一个开发分支合并到master中,并希望撤消该分支。使用以下步骤:

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

瞧!Master与origin处于同一阶段,您的错误合并状态将被删除。

如果您尚未提交,则只能使用

$ git checkout -f
它将撤消合并(以及您所做的一切)

  • 首先,确保你已经承诺了一切

  • 然后将存储库重置为以前的工作状态:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    
    或者使用
    --hard
    这将删除所有本地的、未提交的更改!):

    使用错误合并提交之前的哈希

  • 通过以下方式检查要在先前正确版本的顶部重新提交的提交:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  • 通过以下方式在存储库的正确版本顶部应用您的正确提交:

    • 通过使用cherry pick(一些现有提交引入的更改)

    • 或者通过以下方式选择提交范围:

      • 在合并之前,首先检查正确的更改:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • 在合并之前,首先检查正确的更改:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
        其中,这是您已提交的正确提交的范围(不包括错误提交的合并)


  • 奇怪的是,最简单的命令竟然丢失了。大多数答案都有效,但撤消刚才的合并,这是一种简单而安全的方法

    git revert -m 1 commit_hash
    
    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    
    git reset --merge ORIG_HEAD
    
    ref
    ORIG_HEAD
    将指向合并前的原始提交

    --merge
    选项与合并无关。它就像
    git reset--ha
    
    git reset --merge
    
    git reset --hard
    
    git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
    
    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
    
    git checkout e5f6g7h8
    
    git checkout -b feature-1
    
    git reset HEAD~1
    # Make sure what you are reverting is in fact the merge files
    git add .
    git reset --hard
    
    git reset --hard remotes/origin/HEAD
    
    git merge --abort
    
    git merge --abort
    
    git reset --hard origin/develop
    
    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
    
    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
    git checkout HEAD@{...}
    
    $ git log --graph --oneline --all
    
    $ git merge feature-1
    
    $ git log --graph --oneline --all
    
    $ git reset --hard HEAD~1
    
    $ git log --graph --oneline --all
    
    git reset --merge ORIG_HEAD