git在重置之前返回先前的提交

时间:2015-04-23 06:22:08

标签: git github git-svn

我更改了一些代码,然后运行

git add .
git commit -m "message1"

但在那之后,我做了

git reset hard
git pull
git push

(当然,推动实际上没有做任何事情。)

现在我想在提交“message1”时检索我的文件状态。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

git reset hard index (不是工作目录)重置为名为hard的分支的状态。所以没有任何改变:你可以做一个简单的git reset来重置索引。无论如何,没有其他任何改变。

如果你做了git reset --hard,那就不一样了。这会将工作目录中的索引和未提交的更改重置为HEAD状态,即当前分支的最后一次提交。由于您在该命令之前直接进行了提交,因此如果您在该提交中包含工作目录的所有更改,则也不会丢失任何内容。如果你没有,那么你运气不好,那些从未进入索引的未提交的更改将丢失。

git pull将从远程获取并将任何更改合并到您的分支中,因此这可能实际上已经发生了变化。由于您在本地进行了提交,因此有两种情况:您是最新的,没有任何更改;远程有变化,Git创建了一个合并提交。在后一种情况下,您可以使用git reset --hard HEAD@{1}还原它。您还可以使用git reflog检查reflog,以查看HEAD之前指向的位置。

至于git push,它没有做任何事情并不明显。实际上,既然你在本地提交了一个提交,它应该已经做了一些事情。它应该已经将您的提交和最终合并提交(如上所述)推送到远程。在这种情况下,不建议再次返回(使用上面的命令)撤消这些更改,因为您永远不应删除已发布的提交。

答案 1 :(得分:1)

只需使用git reflog即可。它将显示您在存储库中执行的操作的完整历史记录 跟踪要恢复的提交以将其签出后,​​打开一个新分支(因为您将处于分离的HEAD中)并从那时起继续工作。

第二件事

将内容添加到存储(索引)后,只要您的gc没有运行,您就可以随时恢复它。您可以使用git fsck查找这些dangaling文件的SHA-1并使用`git cat-file -p'恢复它们以查看内容并将其复制到您的需要。