git撤销某个commit - idea撤销commit




撤消尚未推送的Git合并 (18)

在我的主分支中,我在本地做了一个git merge some-other-branch ,但从未将更改推送到origin master。 我不是故意合并,所以我想撤消它。 合并后执行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.

我不希望我的分支机构通过任意数量的提交来领先。 我该如何回到这一点?


  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
        

        这是您提交的正确提交的范围(不包括错误提交的合并)。


策略:从一切都很好的地方创建一个新的分支。

理由:恢复合并很难。 解决方案太多,取决于许多因素,例如您是否已提交或推送合并,或者自合并以来是否有新的提交。 此外,您仍然需要对git有一个相对深入的了解,以使这些解决方案适应您的情况。 如果你盲目地遵循一些指示,你最终会得到一个“空合并”,其中没有任何东西将被合并,进一步的合并尝试将使Git告诉你“已经是最新的”。

解:

假设你想将dev合并到feature-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


使用现代Git,您可以:

git merge --abort

较旧的语法:

git reset --merge

老套:

git reset --hard

但实际上,值得注意的是git merge --abort只相当于git reset --merge因为MERGE_HEAD存在。 这可以在Git help for merge命令中读取。

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在日常工作中更加强大和有用,因此这是我一直使用的。


假设您的本地主人不在原点/主人之前,您应该能够做到

git reset --hard origin/master

然后您的本地master分支看起来应该与origin/master相同。


在这种情况下,您需要使用git reset --hard <branch_name>重置分支。 如果要在重置之前保存更改,请确保创建新分支和git checkout <branch_name>

您可以使用git reset --hard <commit_id>将状态重置为特定提交。

如果已推送更改,则可以使用git revert <branch_name> 。 一定要在其他场景中查看如何使用git revert和git checkout


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

git reset --merge ORIG_HEAD

ref ORIG_HEAD将指向合并之前的原始提交。

--merge选项与合并无关。它就像git reset --hard ORIG_HEAD ,但更安全,因为它不会触及未提交的更改。)


如果你想要一个命令行解决方案,我建议你去MBO的答案。

如果你是新手,你可能会喜欢图形方法:

  1. 启动gitk (从命令行开始,或者右键单击文件浏览器,如果有的话)
  2. 您可以轻松地发现合并提交 - 顶部的第一个节点有两个父节点
  3. 按照指向第一个/左侧父级的链接(合并前当前分支上的那个,通常是红色)
  4. 在选定的提交上,右键单击“将分支重置为此处”,在那里选择硬重置

如果你还没提交,你只能使用

$ git checkout -f

它将撤消合并(以及您所做的一切)。


如果您提交了合并:

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

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


得到这个问题也希望恢复匹配原点(即,NO提交原点之前)。 进一步研究,发现有一个reset命令:

git reset --hard @{u}

注意: @{u}origin/master简写。 (当然,您需要该远程存储库才能实现此功能。)


您只能使用两个命令来恢复合并或通过特定提交重新启动:

  1. git reset --hard commitHash (你应该使用你想要重启的提交,例如44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (将新的本地主分支发送到origin / master)

祝你好运,继续吧!


您可以使用git-reset命令。

git-reset - 将当前HEAD重置为

指定的状态。 git reset [--mixed |

--soft | - 硬| --merge] [-q] [] git reset [-q] []

[ - ] ... git reset --patch

[] [ - ] [...]

GIT-Reset


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

git reset --hard HEAD^

甚至HEAD^^还原那个还原提交。 如果您不确定应该采取多少步骤,则始终可以提供完整的SHA参考。

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


我能够使用一个不涉及查找提交ID的单个命令来解决此问题。

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

接受的答案对我没有用,但是这个命令达到了我想要的结果。


最简单的机会,比这里说的任何事情简单得多:

删除本地分支(本地分支,而不是远程分支)并再次将其拉出。 这样您就可以撤消主分支上的更改,任何人都会受到您不想推送的更改的影响。 重新开始吧。


最近,我一直在使用git reflog来帮助解决这个问题。 这大部分仅在合并刚刚发生时才有效,并且它在你的机器上。

git reflog可能返回如下内容:

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

第一行表示发生了合并。 第二行是我合并之前的时间。 我只是git reset --hard 43b6032强制这个分支在合并之前进行跟踪,并随身携带。






git-merge