2017-01-30 85 views
2

在一个回购,我有一个提交具有大量被意外演出和包含在提交文件删除的(头部后面约3)。根据不同的文件类型,它们在执行时git log --stat像出现以下任一:如何从历史提交中撤消文件删除?

path/to/some/file      | Bin 22522 -> 0 bytes 
path/to/another/kind/of/file   | 1 - 

我想扭转这些缺失和没有任何人出现在我的承诺。 (注意:我并不试图隐藏删除操作,所以如果有反转它的方法,那也可以,我只是不希望我的PR在这些文件删除操作中合并)。

If在反转文件删除之后,我应该做些更新远程操作,这也会有所帮助。

+0

只是问题'git的恢复offending_commit_id'? – eis

回答

3

这有什么好做摇头,而是有选择地提交取消(Git中林果,“reverting”)的一些文件。

在你的情况下,@~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,只选择未跟踪文件(即,由混帐复归再次创建的文件,因为这些创作取消什么是在@~3删除)。
见 “Git add only all new files, not modified files”。

+0

没有任何改变,如果这些被删除的文件在以前未被跟踪,但加入由'git的舞台添加.'?我很想回去,并将它们从舞台上移开,因为它们从未被追踪过。 – zahabba

+1

@zahabba这是不同的:为了确保他们从未被追踪过(意味着他们没有任何回购历史提交),你需要一个'git filter-branch'(https://help.github.com/articles/从存储库中删除敏感数据/),这将重写所述历史记录。 'git revert'不那么干扰,创建一个新的提交,而不是'git filter-branch',改变过去的提交。 – VonC