如何撤消git merge squash?

时间:2011-09-17 21:31:29

标签: git version-control git-merge

我刚刚做了一个

git merge --squash feature-branch

进入我的develop分支。

问题是上面的命令更新了头部而没有创建新的提交。我的目的是创建一个单独的提交以应用于develop的头部。

简而言之,合并前后develop分支的日志完全相同。

有没有办法将develop恢复到git merge之前的状态?

谢谢。

解决方案

根据Dan D.的评论和下面接受的答案,我能够解决我的问题。如果您在同一条船上,请参阅下面的内容:

1 - 我运行了git reflog,它列出了我对develop分支所做的所有提交和检查。

2 - 我没有按照建议做git reset HEAD@{1},而是在我做最后一次提交时发现了我希望保留的数字。就我而言,它是HEAD@{188}。所以我输入了git reset HEAD@{188}

3 - 我运行了一个git log,它有一个干净的日志,只显示我在进行错误合并之前的提交。

4 - 我运行git add -A .来暂存在功能开发期间创建的所有新文件。

5 - 我跑了git commit -m "install feature-x"

6 - 结果现在我的分支develop包含正确的文件并且日志是干净的 - 只显示了我在feature-x开发过程中所做的所有更改的一次提交。

我仍然需要找出原来git merge --squash feature-branch无效的原因。

解决方案2

Mark Longair的回答是我问题的最终解决方案。我刚刚测试了它,它的工作原理。请参阅下面我正在使用的流程来压缩feature-branch内的所有内部提交,并且只包含一个develop分支提交:

git checkout develop
git merge --squash feature-branch
git commit -m "install of feature-branch"

上面的序列就像一个魅力。

2 个答案:

答案 0 :(得分:17)

如果运行git merge --squash <other-branch>,工作树和索引会更新合并的结果,但不会创建提交。您需要做的就是运行:

git commit

但是,如果您在提交之前改变主意并且只想中止合并,则只需运行:

git reset --merge

您不需要使用reflog。

答案 1 :(得分:0)

如果您在提交前改变主意,可以选择以下选项:

使用现代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在日常工作中更有用。