git - 从 Git 历史记录中删除文件而不删除文件

标签 git

我使用了 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:

我可以使用 8ef0c30HEAD@{1}(即 HEAD 的先前位置)或 original/refs/remotes/origin/masteroriginal/refs/heads/master 回到过滤器运行之前的状态。

关于git - 从 Git 历史记录中删除文件而不删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333200/

相关文章:

git - 被 gitolite 锁定并且无法 gl-admin-push

linux - 如何为 buildbot 用户设置 SSH key

php - 在apache服务器上通过php执行bash文件

git - 如何调试 : Git pull hangs during git pull (always at 54%)

git - 使用Git命令行提示 "[master +1 ~0 -0 !]>"是什么意思?

git - 如何删除以前添加的 git 子树及其历史记录

Git 在制表符和空格之间转换,但只是有时

git - 如何检索 Git 中具有特定扩展名的所有文件的最后修改日期?

git - 强制覆盖 TortoiseGit 推送对话中缺少的现有分支

git pull master 而不覆盖本地分支上的文件