我怎样才能在Git中恢复丢失的提交?

首先,通过3次提交得到“你的分支在原点/主人之前”,那么我的应用程序已经恢复到较早的时间。

我怎样才能得到我最近11个小时做的事?

git reflog是你的朋友。 find你想要在列表中的提交,你可以重置它(例如: git reset --hard e870e41 )。

(如果你没有做出改变……你可能会遇到麻烦 – 提早做出决定,经常做出决定!)

首先什么是头?

HEAD只是对当前分支中当前提交(最新)的引用。
在任何时候只能有一个HEAD

如果你不是最近的提交 – 这意味着HEAD指向历史上的一个事先提交的被称为分离的HEAD。

在这里输入图像描述

几个选项:

git checkout

 git checkout <commit_id> 

git reflog

您也可以随时使用reflog

 git reflog git checkout HEAD@{...} 

这会让你回到你想要的提交

在这里输入图像描述


git reset HEAD --hard <commit_id>

“移动”你的头回到所需的提交。

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there's work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 
  • 注意:( 从Git 2.7开始 )
    你也可以使用git rebase --no-autostash

git checkout

 git checkout -b <new branch> <commit_id> git checkout HEAD~X // x is the number of commits t go back 

这将检出指向所需提交的新分支


这是一个可以做什么的一般模式。

在这里输入图像描述

使用git fsck命令来实现删除提交的另一种方法是使用git fsck命令。

 git fsck --lost-found 

这将输出像在最后一行:

 dangling commit xyz 

我们可以根据其他答案中的build议检查是否使用了reflog 。 现在我们可以做一个git merge

 git merge xyz 

注意:
如果我们已经运行了一个git gc命令,它将删除对悬挂提交的引用,我们不能用fsck获得提交。