如何取消删除已推送删除的文件?

How to undelete a file whose deletion was pushed?

我删除了一个文件,并推送了这些更改。我想知道取消删除此文件的最佳方法是什么。

我正在考虑重新添加文件并推送更改。这是解决问题的最佳方法吗?

编辑:

推送之后,还有其他代码推送,但我不想撤销那些推送。

我正在使用 GitHub

编辑: 请注意,OP 在问题中添加了关键信息;此答案的第一部分假设情况并非如此。


每个提交都有每个文件的完整快照(好吧,那个提交中的每个文件)。

这意味着您有一系列快照:

...--F--G--H   <-- somebranch, origin/somebranch

其中 H 保存 最新 快照,其中包含一些文件集。由于您删除了一个文件,H 比快照 G.

有一个 个文件

如果您再次制作包含该文件的新快照,您会得到:

...--F--G--H   <-- origin/somebranch
            \
             I   <-- somebranch

I 中的快照与 H 中的快照相匹配,只是 H 中缺少的文件存在于 I 中。当你 git push 这个提交给另一个 Git 时,另一个 Git 应该接受它并将它添加到 他们的 somebranch,所以你现在拥有:

...--F--G--H--I   <-- somebranch, origin/somebranch

Commit H 继续存在,继续缺少文件。只要没问题就好。

您根本无法更改提交H,所以如果那没问题,您将拥有说服其他Git 丢弃 提交副本H。一般来说,你这样做的方法是通过制作一个新的和改进的提交 H 来替换 H:

来丢弃你的
          H   <-- origin/somebranch
         /
...--F--G--H'  <-- somebranch

其中 H' 有文件。然后你使用 git push 的强制推送变体告诉另一个 Git 你知道这个请求会让他们 扔掉 他们的提交 H 并将其替换为新的和改进的 H',是的,您希望他们这样做。

如果其他人他们自己的 提交依赖于现有的提交H,这对其他人来说不是很好。确保没有其他人依赖于您将以这种方式删除的任何提交。如果您是唯一使用 other Git 存储库的人,这意味着您只需要同意自己的看法。如果其他人也使用其他 Git 存储库,请先征得他们的同意。

(如果可以保留 H,那几乎总是更容易和更好。)


重新编辑:那条信息非常重要。这意味着已经有一些其他提交 IJ 等,在 之后 H 缺少文件。提交 IJ 等,大概是 缺少文件。如果您构建一个新的和改进的替换提交 H',您还必须构建一个新的和改进的替换 I'J'

根据文件是否是该提交中唯一修改的文件,您有不同的选项和不同的方法。

  1. 将分支移动到文件被删除之前的提交,并强制推送到远程。如果您是唯一一个在存储库上工作的人,或者在任何情况下您确定没有人已经从远程提取更改,这没关系,因为在这种情况下,它会为他们造成本地冲突。这将从历史记录中删除任何删除痕迹,因为删除文件的提交将在强制推送时丢失。

    如果错误的提交是最后一次提交,你可以这样做:

    git reset HEAD~1
    git push --force
    

    如果这不是最后一次提交,我不建议使用此方法,因为它会在更改哈希后重写每个提交(如果与更多协作者一起工作,这会导致问题),但它仍然可以完成交互式变基:

    git rebase --interactive <hash_of_bad_commit>~1
    # choose "delete" on the bad commit
    git push --force
    

    git rebase 在弹出的编辑器中询问时,将错误提交的行更改为 d(或 delete)并保存。 rebase 应该是自动的,然后你可以强制推送。您可以查看 git log 的输出来获取错误提交的哈希值。

    如果那是 不是 提交修改的唯一文件,那么在 rebase 中你将不得不 select e (或 edit) 对于错误的提交,请自行解决问题,然后提交并继续变基:

    git rebase --interactive <hash_of_bad_commit>~1
    # choose "edit" on the bad commit
    git checkout HEAD~1 <path_to_deleted_file>
    git commit
    git rebase --continue
    git push --force
    
  2. 创建一个还原提交,撤销您删除文件的错误操作,然后推送到远程。这是最简单和最安全的选择。你可以这样做:

    git revert <hash_of_bad_commit>
    git push
    

    同样,您只需查看 git log.

    即可获得错误提交的哈希值

    如果那是 不是 错误提交所触及的唯一文件,您可以 select 使用 git reset 主动恢复对该特定文件的更改,例如这个:

    git reset <bad_commit_hash> <path_to_deleted_file>
    git commit
    git push
    
  3. 手动添加回文件并创建新的提交。这将与第二个选项具有相同的效果,但需要手动完成。

如果您想要一个干净的历史记录并且独自工作,我会推荐选项 1,如果您不关心提交历史记录或者如果您正在与多个贡献者一起工作的存储库,我会推荐选项 2。确实没有理由选择选项 3,因为数据已经在 GIT 历史记录中可用,您不需要手动重新添加文件,如果添加 [=64] 可能会造成麻烦=] 它的版本。


处理您的编辑:

Since the push, there have been other code pushes, but I do not want to reverse those pushes.

那我肯定会建议你选择上面的选项 2。