如何在Git中恢复丢失的提交?

时间:2012-04-11 03:04:02

标签: git

首先,通过3次提交获得“你的分支超前于原点/主人”,然后我的应用程序恢复到早期更改的早期时间。

我怎样才能得到过去11个小时所做的事情?

7 个答案:

答案 0 :(得分:419)

git reflog是你的朋友。在该列表中找到您要进行的提交,然后重置为该提交(例如:git reset --hard e870e41)。

(如果您没有提交更改......您可能遇到麻烦 - 提前提交,并经常提交!)

答案 1 :(得分:86)

首先:什么是HEAD

HEAD只是对当前分支中当前提交(最新)的引用 在任何给定时间只能有HEAD

如果您没有进行最新提交 - 意味着HEAD指向历史记录中的先前提交,则称为已分离的HEAD。

enter image description here

几个选项:

git checkout

git checkout <commit_id>

git reflog

您也可以随时使用reflog

git reflog
git checkout HEAD@{...}

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

enter image description here

git reset HEAD --hard <commit_id>

&#34;移动&#34;回到理想的承诺。

# 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.
  • 注意:(Since 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 to go back

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

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

enter image description here

答案 2 :(得分:24)

获取已删除提交的另一种方法是使用git fsck命令。

git fsck --lost-found

这将输出类似于最后一行的内容:

dangling commit xyz

我们可以使用其他答案中建议的reflog来检查它是否是相同的提交。现在我们可以做git merge

git merge xyz

注意:
如果我们已经运行fsck命令将删除对悬空提交的引用,则无法使用git gc返回提交。

答案 3 :(得分:4)

尝试一下, 这将显示一段时间内git中记录的所有提交

git reflog

找到所需的提交

git log HEAD@{3}

git log -p HEAD@{3}    

然后检查它是否正确:

git checkout HEAD@{3}

这将为该提交创建一个独立的头部。添加并提交所需的任何更改

git status 
git add
git commit -m "temp_work" 

现在,如果要将恢复到分支的提交还原为master,则需要将此分支开关命名为master,然后合并到master。

git branch temp
git checkout master
git merge temp

这也是Git教程站点上专门用于reflog的链接: Atlassian Git Tutorial

答案 4 :(得分:3)

这件事就在今天发生在我身上,所以我正在写一些对我来说是救命稻草的东西。我的回答与@Amber 的回答非常相似。

首先,我做了一个 git reflog 并搜索了那个特定提交的哈希,然后只是复制了那个哈希并从那个分支做了一个 git cherry-pick <hash>。这将丢失提交的所有更改都带到了我当前的分支,并恢复了我对 GIT 的信心。

祝您有美好的一天!

答案 5 :(得分:0)

  1. 运行命令“ git fsck --lost-found”。它将返回带有一些随机数的悬挂提交,例如39ba87bf28b5bb223feffafb59638f6f46908cac
  2. 然后运行命令git merge 39ba87bf28b5bb223feffafb59638f6f46908cac。这将使您的更改恢复到您的代码。

答案 6 :(得分:-5)

可悲的git太不可靠了:( 我只是失去了工作2天:(

最好在执行提交之前手动备份任何内容。我只是做了“ git commit”,而git只是摧毁了我的所有更改而没有说什么。

我吸取了教训-下次先备份,然后再提交。千万不要相信git。