我刚刚做了一个
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"
上面的序列就像一个魅力。
答案 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
在日常工作中更有用。