git rebase吃了我的提交内容! 帮我翻译一下git reflog的输出。

问题描述 投票:3回答:2

我做了五个提交,我想在推送之前把它们都变成一个提交。出于某种原因,我决定尝试用一种不同于我通常使用的方法来实现。

FWI: 我试图按照这里的说明来做。http:/gitready.comadvanced20090210squashing-commits-with-rebase.html。 .

下面我会放很多细节,但你可能想跳到问题的底部,在那里我放了 git reflog 因为我怀疑这才是重要的。

所以我是这样做的--我把所有的修改都提交了,然后我做了.com。

git rebase -i HEAD~5

然后我看到了文本编辑器,里面显示了提交的内容,我错了,我现在意识到,我把第一列的 "pick "值都改成了 "squash"。

然后我看到了一条错误信息。我不记得错误信息说了什么,但我想应该是 "你没有提交要使用"。

在那一刻,我又回到了提示,当我试图重复.com的时候,我得到的信息是:"你没有提交使用"。

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.coma12163247364088。 这建议做 。

git reset --soft HEAD^

我做了(我希望我没有)。在我做完之后。

git status

显示了许多未提交的文件,虽然

git diff

显示没有变化。无论如何,我然后做了一个

git commit

现在,我已经失去了我所有的chnages在过去的五次提交!

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

所以问题是,标有 "快照提交--稍后粉碎 "的提交是我想合并成一个提交的。

HEAD@{2}和HEAD@{1}是我在合并 "快照提交--稍后粉碎 "的过程中做的事情。提交 HEAD@{0} 是我在重启和重置之后做的提交。

如果有必要的话,最后推送的提交是 HEAD@{8}。

所以,我希望回到 "705736f "的提交,然后,最好再做一次合并提交,只是这次要让它正常工作。

如果能恢复 "快照提交--稍后压制 "的工作,我会非常高兴。

如果能得到建议,我将感激不尽。

git version-control git-rebase git-reset
2个回答
3
投票

我比较喜欢的方法是在你想拿回来的东西上贴一个标签,比如一个分支。

git branch recover 705736f

这时你可以检查一下(这是一个新的本地分支),确保你已经恢复了你想要的东西。

git checkout recover
git log    # or gitk, or whatever

这是一个新的分支标签,指向旧的(base-attempt前)提交。

你的新提交 (Decorator demo added)将在另一个分支上,这(在图形日志查看器中,如 gitk --branchesgit log--graph)后分叉。Early version of the decorators demo 的提交。


如果你愿意 "失去 "新的提交(除了在重新记录中),你可以在重新记录中强制将当前分支重置为旧的提交。

git reset --hard 705736f

(而不是创建一个新的分支指向新的提交) 705736f). 再次,运行 git log 看看是否是你想要的地方(你甚至可以在你想要的地方 git log 705736f 首先!)。)


1
投票

只要这样做。

$ git reset --hard HEAD@{3}

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

© www.soinside.com 2019 - 2024. All rights reserved.