如何从历史提交中撤销文件删除?

3
在一个代码库中,我有一次提交(大约比HEAD晚3个版本),其中有很多文件的删除是不小心暂存并包含在该提交中的。根据文件类型,在执行git log --stat时,它们可能会显示为以下任一形式:
path/to/some/file                     | Bin 22522 -> 0 bytes
path/to/another/kind/of/file          | 1 -

我希望撤销这些删除,并且不希望它们出现在我的提交中。(注意:我并不想隐藏这些删除,所以如果有一种方法可以撤销它们,那也可以。我只是不想让我的PR合并这些文件删除。)
如果撤销文件删除后需要更新远程,请让我知道。

只需要执行git revert offending_commit_id命令吗? - eis
1个回答

4

这与移动HEAD无关,而是选择性地取消(在Git术语中称为“还原”)某些提交中的文件。

在您的情况下,@~3提交包括您不想要的删除,但还有其他文件(您可能不想还原)。

git revert --no-commit @~3 # Revert, don't commit it yet
git reset                  # Unstage everything

# add only the files you need (ie the one created, not the ones modified)
git add $(git ls-files -o --exclude-standard)

在这里,您希望在还原所有提交@~3之后,仅选择未跟踪的文件(即由git revert重新创建的文件,因为这些创建会取消在@~3中删除的内容)。


请参见“Git add only all new files, not modified files”。

如果那些被删除的文件之前未被跟踪,但是通过 git add . 添加到了暂存区,是否会有任何变化?我想回去将它们从暂存区中移除,因为它们本来就不应该被跟踪。 - zahabba
1
@zahabba 这是不同的:为确保它们从未被跟踪(也就是说它们不在存储库历史记录的任何提交中),您需要使用 git filter-branch(https://help.github.com/articles/removing-sensitive-data-from-a-repository/),这将重写历史记录。`git revert不太具有侵入性,只会创建一个新的提交,而git filter-branch` 会更改过去的提交。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接