我怎样才能在Git中恢复丢失的提交?
首先,通过3次提交得到“你的分支在原点/主点之前”,然后我的应用程序已经恢复到较早的时间,并且有更早的更改。
我怎样才能得到我过去11个小时做的事情?
git reflog
是你的朋友。 找到你想在列表中提交的内容,然后重新设置它(例如: git reset --hard e870e41
)。
(如果你没有提交你的修改......你可能会遇到麻烦 - 提前做出承诺,并经常提交!)
首先什么是HEAD
?
HEAD
只是对当前分支中当前提交(最新)的引用。
任何时候只能有1个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 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 --lost-found
这将输出类似于最后一行的内容:
dangling commit xyz
我们可以根据其他答案中的建议检查它是否与使用reflog
相同。 现在我们可以做一个git merge
git merge xyz
注意:
如果我们已经运行了一个git gc
命令,它将删除对悬挂提交的引用,我们无法使用fsck
获得提交。