是否可以完全删除Git分支?

时间:2015-02-19 12:39:46

标签: git branch

我读过,通常情况下,删除的分支可以复活。

我正在寻找一种完全消灭分支的方法。

其中一位开发人员在该分支机构内部存放了2Gb的资产,这实际上是内容,不应该在回购中。

注意:我还没有将它合并为主人!

2 个答案:

答案 0 :(得分:2)

您应该能够通过使用git filter-branch来做到这一点。例如,假设要删除的文件位于名为content的目录中:

git filter-branch --tree-filter 'rm -rf content' --prune-empty

这将迭代分支中的所有提交,从发生的任何提交中删除错误的内容。

答案 1 :(得分:2)

我想补充一点,我个人更喜欢filter-branch方法,因为这并不涉及历史的丢失。如果filter-branch似乎难以使用,您可以查看更简单的BFG Repo-cleaner

尽管如此,我还是会为完整性提供一种替代方案。


既然您在评论中说过,您可以选择丢弃旧合并并创建一个新合并,我建议您创建一个壁球合并

假设您的存储库具有与此类似的历史记录。

* The merge commit [master]
|\
| * feature commit [feature]
| |
| * feature commit (the evil one)
. .
. . (some more commits)
. .
|/
*

首先,我们将撤消合并。

git checkout master
git reset --hard HEAD^

现在我们再次合并功能,但这次使用--squash选项。执行此操作时,git不会创建通常的合并提交(说多个父项),但它将应用功能分支中的所有更改,并使您的工作树处于状态,就像& #34;通常"合并发生(take a look at the documentation)。

git merge --squash feature

现在您可以解决可能的冲突,然后只提交合并的更改(git commit)。但是,请注意,这样的合并显然没有引用合并分支的历史记录(在本例中为 feature );您应该在提交消息中包含该信息。

假设除了实际分支之外没有其他对 feature 的引用 - 您现在可以继续删除分支,然后是garbage collection

git branch -D feature
git gc

您必须意识到git gc仅删除 功能分支的历史记录和 blob ,如果您有<强>没有其他参考指向他们。你必须确保是这种情况。


重要

git gc不仅会删除功能分支的历史记录,还会删除每个悬空对象。为了更好地理解我建议阅读课程书的Git Internals - Maintenance and Data Recovery章节的含义和后果。