【问题标题】:Is it possible to restore commit history in git?是否可以在 git 中恢复提交历史记录?
【发布时间】:2019-10-12 20:02:42
【问题描述】:

我有 2 个存储库,用于前端和后端。远程后端存储库与本地存储库非常不同,因为我独自工作,我决定通过删除本地存储库中的 .git 文件夹来覆盖远程存储库,通过 git init 启动新的并通过以下方式全部推送:

git push --force dev master

但具有讽刺意味的是,我添加了错误的分支:

git remote add dev frontend-repo

并覆盖我上个月工作的前端存储库。

我取消了最后一次提交:

git revert {commit_id}

现在我有一个空的前端存储库,我已经工作了一个月,并且我想更改未触及的存储库。本地我有所有提交历史和存储库本身,问题 - 有没有办法恢复这个历史甚至完全撤消最近的更改?

【问题讨论】:

  • 您分别在哪些计算机上的哪些存储库中运行了这些命令?
  • 如果这不是很久以前,删除的提交仍然存在于您的存储库中,但无法访问,因为它们不再被引用。因此,您可能可以使用git fsck 找到已删除的提交。见this question
  • 短语“提交历史”可能是多余的:在 Git 中,提交历史。每个提交都有自己唯一的哈希 ID,每个提交通过哈希 ID 引用其直接父级。你要么有提交,要么没有。如果您有提交,则 commit 确定其父级,从而确定其历史记录。
  • 请注意,Git 通常发现提交,但是,从分支名称开始。分支名称包含一 (1) 个提交的哈希 ID。该提交列出了它的父母,这是它的直接历史。每个父提交都会列出 个父级,依此类推。所以分支名称 master 的历史是:无论提交哈希 ID master 持有什么。将正确的哈希 ID 放在名称 master 中,您就会拥有您喜欢的任何历史记录。
  • 每个存储库都有自己的分支名称。 git push --force 只是让一个 Git 调用另一个 Git 并说:将您的分支名称 设置为 如果您可以在具有存储库的机器上登录,您可以使用git refloggit fsck 和其他答案如下所示。如果没有,您可以尝试在您拥有的任何存储库副本中找到正确的哈希 ID,然后再次 git push --force

标签: git


【解决方案1】:

使用您的git reflog 恢复您的历史记录和分支。 完整的解释和示例代码可以在这里找到:

How to move HEAD back to a previous location? (Detached head) & Undo commits


git reflog

您也可以随时使用reflog
git reflog 将显示更新HEAD 的任何更改,并且检查所需的引用日志条目会将HEAD 设置回此提交。

每次修改 HEAD 时,reflog 中都会有一个新条目

git reflog
git checkout HEAD@{...}

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


【讨论】:

  • 我在本地分支上看到了必要的提交,如何在不丢失提交历史记录的情况下将远程存储库返回给它?
  • 只需 git reset --hard HEAD@{0} ?
  • 是的,或者重置为所需的提交。 git reset <SHA-1> --hard。一旦你有所需的提交再次推送你的更改 -f
【解决方案2】:

有一个名为 git reflog 的 git 命令,您可以在其中查看所有本地更改,并且可以通过哈希恢复

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2013-08-07
    • 2014-11-20
    相关资源
    最近更新 更多