git 在硬重置之前返回到之前的提交

git go back to a previous commit before reset hard

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

git add .
git commit -m "message1"

但在那之后,我做到了

git reset hard
git pull
git push

(当然,推送实际上什么也没做。)

现在我想在提交 "message1" 时检索我的文件的状态。我该怎么做?

只需使用git reflog。它将显示您在存储库中所做操作的完整历史记录。
一旦您跟踪了要还原的提交以将其签出,打开一个新分支(因为您将处于分离的 HEAD 中)并从该点继续您的工作。

第二件事

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

git reset hardindex(不是工作目录)重置为名为 hard 的分支的状态。所以实际上什么都没有改变:你可以做一个简单的 git reset 来重置索引。反正其他什么都没变。

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

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

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