git rebase吃了我的提交!翻译'git reflog'输出给我?

时间:2014-03-05 08:03:18

标签: git version-control git-rebase git-reset

我做了五次提交,我想在推送它们之前将它们全部改为一次提交。出于某种原因,我决定尝试通过与我通常使用的不同的方式来做到这一点。

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'提交然后,理想情况下再次合并提交只有这次才能使它工作!

如果我能在“快照提交 - 壁球后期”更改中恢复工作,我会很高兴。

感谢您的建议。

2 个答案:

答案 0 :(得分:2)

我首选的方法是在你想要回来的东西上贴一个标签,比如分支:

git branch recover 705736f

此时你可以查看它(它是一个新的本地分支)并确保你已经恢复了你想要的东西:

git checkout recover
git log    # or gitk, or whatever

这是一个新的分支标签,指向旧的(重组前尝试)提交。

您的新提交(Decorator demo added)将位于另一个分支上,该分支(在图形日志查看器中,如gitk --branchesgit 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}

你会回到你最后一次提交的地步。从那时起你就可以采取相应行动了。