我做了五次提交,我想在推送它们之前将它们全部改为一次提交。出于某种原因,我决定尝试通过与我通常使用的不同的方式来做到这一点。
FWIW:我试图按照http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html中的说明进行操作。
我将在下面详细说明,但你可能想跳到我把git reflog
输出的问题的底部,因为我怀疑这是重要的。
所以这就是我的所作所为 - 我做了所有改变:
git rebase -i HEAD~5
我看到了文本编辑器,它显示了提交,我现在错误地认识到,将'pick'的所有第一列值更改为'squash'。
然后我看到了一条错误消息。令我感到羞耻的是,我不记得错误信息的内容,但我认为它说的是“你没有承诺使用”。
那时我回到了提示,当我尝试重复:
git rebase -i HEAD~5
我收到消息:
It seems that there is already a rebase-merge directory, and
I wonder if you are in the middle of another rebase. If that is the
case, please try
git rebase (--continue | --abort | --skip)
If that is not the case, please
rm -fr /home/foo/dev/bar/.git/rebase-merge
and run me again. I am stopping in case you still have something
valuable there.
然后我读了这个答案https://stackoverflow.com/a/12163247/364088,建议这样做:
git reset --soft HEAD^
我做到了(我希望我没有)。我做完之后。
git status
显示了许多具有未提交更改的文件,但
git diff
没有显示任何变化。无论如何,我做了一个
git commit
现在我在最后五次提交中丢失了所有的内容!
git reflog
显示(这只是它的顶部):
3f80e4b HEAD@{0}: commit: Decorator demo added
1888dd9 HEAD@{1}: reset: moving to HEAD^
7d6228e HEAD@{2}: checkout: moving from master to 7d6228eb9b03d0c45acf7c66e662220213cf4fb9
705736f HEAD@{3}: commit: Snapshot commit - squash later
75db0c3 HEAD@{4}: commit: Snapshot commit - squash later
b70b50f HEAD@{5}: commit: Snapshot commit - squash later
d970a62 HEAD@{6}: commit: Snapshot commit - squash later
0f24e88 HEAD@{7}: commit: Snapshot commit - squash later
7d6228e HEAD@{8}: commit: Move some standard code into its own module and tidy up .
1888dd9 HEAD@{9}: commit: Early version of the decorators demo
所以事情是标记为“Snapshot commit - squash later”的提交是我想要合并到单个提交中的提交。
提交HEAD @ {2}和HEAD @ {1}是我在尝试合并“Snapshot commit - squash later”的过程中所做的事情。提交HEAD @ {0}是我在rebase和reset之后做的提交。
如果重要的话,推送的最后一次提交是HEAD @ {8}。
所以我想要的是回到'705736f'提交然后,理想情况下再次合并提交只有这次才能使它工作!
如果我能在“快照提交 - 壁球后期”更改中恢复工作,我会很高兴。
感谢您的建议。
答案 0 :(得分:2)
我首选的方法是在你想要回来的东西上贴一个标签,比如分支:
git branch recover 705736f
此时你可以查看它(它是一个新的本地分支)并确保你已经恢复了你想要的东西:
git checkout recover
git log # or gitk, or whatever
这是一个新的分支标签,指向旧的(重组前尝试)提交。
您的新提交(Decorator demo added
)将位于另一个分支上,该分支(在图形日志查看器中,如gitk --branches
或git log
与--graph
)分叉后Early version of the decorators demo
提交。
如果您愿意“丢失”(在reflog中除外)新提交,您可以将当前分支强制重置回reflog中的旧提交:
git reset --hard 705736f
(而不是创建一个指向705736f
的新分支)。再次,运行git log
以查看是否符合您的要求(您甚至可以git log 705736f
!)。
答案 1 :(得分:1)
只是做:
$ git reset --hard HEAD@{3}
你会回到你最后一次提交的地步。从那时起你就可以采取相应行动了。