我使用了 GitHub 的 instructions for scrubbing a file from the commit history ,但它从我的系统中删除了相关文件。这让我感到惊讶,因为 git rm --cached
命令本身应该保持文件本身不变。但是这种行为也可以在该页面上的工作示例中看到:尝试在大型 git filter-branch ...
命令之前和之后运行 ls
。
我正在使用 Git 2.6.1。
如何在不删除文件本身的情况下从提交历史中删除文件?显然,我可以只做一个备份(我在我的案例中就这样做了),但这是一种解决方法,而不是解决方案。
最佳答案
git-filter-branch
完成后,它会检查新的分支头。这会将您的工作目录更新为干净状态。您想要从历史记录中删除的文件已被删除。事先备份是解决方案。
如果您忘记备份,您仍然可以找回它! Git 需要很长时间才能把东西扔掉,你原来的提交还在那里。在 git-filter-branch
之后会有一个名为 original/refs/heads/master
的分支(如果你过滤了 master),其中包含原始提交。您可以从那里恢复文件。
通常,您可以使用 git reflog
恢复过滤器和 rebase 。它是每次 HEAD
更改时的日志(即您 checkout 或 rebase 或 merge 或过滤或...)。例如,在做了 Github 过滤器示例之后,git reflog
是...
abaabaf (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: filter-branch: rewrite
8ef0c30 (refs/original/refs/remotes/origin/master, refs/original/refs/heads/master) HEAD@{1}: clone:
我可以使用 8ef0c30
或 HEAD@{1}
(即 HEAD
的先前位置)或 original/refs/remotes/origin/master
或 original/refs/heads/master
回到过滤器运行之前的状态。
关于git - 从 Git 历史记录中删除文件而不删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333200/