【问题标题】:Git recover filesGit 恢复文件
【发布时间】:2019-03-28 15:27:59
【问题描述】:

我将本地文件添加到 git repo (git add .) 并提交。

然后用git rm * 删除文件并再次提交(第二次提交)。这会在本地和远程删除文件。

从 git 将文件返回到同一个本地文件夹(从第一次提交)?

谢谢。

【问题讨论】:

  • 但是你想回到历史?或者您想要保存这些文件的第三个修订版?或者您甚至可能想在第三次提交时revert第二次提交。
  • “本地和远程都删除了文件”——不,它没有。 git rm 是纯本地操作。
  • "本地和远程都删除了文件。"请注意,只有在您同时执行 git push 时才会发生这种情况。

标签: git git-rm


【解决方案1】:

自从您提交后,本地文件是否存在于您分支 HEAD 的文件系统中甚至都无关紧要,因为它是 Git 历史记录的一部分。要从较早的提交中检索文件,您可以尝试将其检出:

git checkout abc123 -- path/to/some/file.ext

其中abc123 是先前提交的 SHA-1 哈希。如果您不知道 SHA-1 哈希是什么,只需在 bash 中运行 git log,然后找到较早的提交以及该提交的哈希。

编辑:

如果您真的想将整个分支恢复到某个较早的提交,那么通常安全的方法是通过git revert。所以,继续上面的例子,如果你想恢复最新的提交abc123,你可以尝试:

git revert abc123

这将在您的分支顶部添加一个 new 提交,但它只会在功能上撤消先前 HEAD 提交所做的任何事情。这应该使您项目中的所有文件都处于早期状态。

【讨论】:

  • -- 是干什么用的?如何还原所有内容(不仅仅是 1 个文件)?
  • 我的解决方案是 git log -agit checkout myShaKeyFromCommit。这从特定提交中取回了所有文件。
  • @Joe 现在我不确定你在追求什么。如果您只想还原几个文件,请使用git checkout。如果您想将整个分支回滚到某个较早的commit 状态,请使用git revert
  • @Joe 好的...但请记住,您现在已丢弃自检出提交以来所做的所有提交。
  • 谢谢。就我而言,这很好,因为只是想先将它们全部取回本地,然后再从那里返回..
【解决方案2】:
git reset --hard HEAD^

将使您的分支返回一次提交并相应地更新工作树(恢复您的文件)。

此时你只需要推送到远程,如果你已经推送了之前的状态,使用--force

但是,如果您处于分离的 HEAD 状态,这将不起作用,您必须检查一下(请参阅 Tim 的回答)。

【讨论】:

  • 请注意,这将带回较早的文件,但也会删除 HEAD 提交,以及该提交中引入的任何新文件。
  • @Tim Fair 点。 OP 的问题中没有明确说明(是否需要保留 HEAD 提交?),但这是谨慎的,你是对的。
【解决方案3】:

如果您只提交已删除的文件,那么您至少有两种选择:

  1. 创建一个恢复旧提交的新提交

    git revert HEAD
    git push
    
  2. 将您的分支重置为上一次提交。

    git reset --hard HEAD
    git push -f
    

    请注意,第二个选项是完全破坏性的。如果您在之前的提交中添加了任何其他更改,它也会撤消所有这些更改。此外,如果您与同一分支的其他团队成员一起工作,那么git push -f 会给他们带来问题。 这只能作为最后的手段,或者在您确定不会为其他人搞砸的情况下使用。

【讨论】:

    【解决方案4】:

    返回一个提交git reset HEAD~1然后将它推送到原点git push -f origin branch_name

    【讨论】:

    • 强制推送具有重写历史记录的分支是不可取的,至少在大多数情况下是这样。如果这是 OP 真正想要的,那么您应该建议使用 git revert
    • 一个git revert 将出现在历史记录中。力推消除了错误。我想这取决于删除是多久前被推送的。如果只有几分钟,我会重写历史。
    • 无论何时建议git reset,都包含有关危险的警告。您是对的,强制推送可以消除遥控器上的错误。但是,如果其他开发人员已经解决了这个错误,那么除非他们知道要修复它,否则他们可以轻松地将其再次推回远程。
    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2014-05-28
    • 2020-07-09
    • 1970-01-01
    • 2013-06-12
    • 2015-08-19
    相关资源
    最近更新 更多