首页 > 解决方案 > 无法重写分支:您有未暂存的更改

问题描述

我想根据git 文档从 git 历史记录中删除一些文件/文件夹,但由于unstaged changes. 我不清楚像我之前所做的那样,有哪些未分阶段的更改 git add --all,提交和推送。请注意,待删除文件夹somefolder/不再存在于 HEAD 中。它在较早的提交中被移动,但它的旧版本需要从 repo 中清除。

~$ git add --all
~$ git commit -m "trying to fix 'Cannot rewrite branches: You have unstaged changes'"
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
~$ git push
Everything up-to-date
~$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
~$ git filter-branch --force --index-filter   "git rm --cached --ignore-unmatch somefolder/"   --prune-empty --tag-name-filter cat -- --all
Cannot rewrite branches: You have unstaged changes.
~$ 

我该如何解决这个问题,以便我可以成功运行最后一个命令?

标签: git

解决方案


首先,确保使用最新的 Git (2.26),因为旧版 Git 中存在关于git filter-branch的错误。

其次,您可能希望将您的存储库克隆为裸存储库,并在那里进行过滤。这将防止任何未暂存的更改,因为裸存储库没有工作树。

但是第三,不要使用过时的 BFG 或git filter-branch为此。
使用新工具git filter-repo(直接在您的常规本地存储库中,尽管在进行此类过滤之前备份总是一个好主意)

使用路径过滤

git filter-repo --path somefolder/ --invert-paths

somefolder/这将从Git 存储库历史记录中删除。


推荐阅读