尽管有多个主题涉及相似的问题,但似乎无法解决Git rebase
。
我有一个很大的Git回购,并且我想减少提交历史的主要部分。提交图的当前状态如下:
(huge tree of various branching and merging) -> commit_I_want_to_squash_to -> branching off into master and couple of feature branches
我想要的结果是:
commit_I_want_to_squash_to_is_first_in_tree -> branching off into master and couple of feature branches
我想这应该是可行的,因为所有当前分支都使用单个提交作为起点。我尝试过与玩游戏git rebase --squash
,但要压缩300多个分支历史记录似乎是一项非常艰巨的任务。应该以某种方式只是在我要首先进行的提交之前“切片”提交树。
因此,本质上您想要做的是比某个提交更早地切断历史记录。用Git术语来说,这意味着您想要将该提交从拥有父级重写为没有父级(成为新历史记录的开始提交)。
这可以使用git filter-branch来完成,如下所示:
git filter-branch \
--parent-filter 'test $GIT_COMMIT = <initial-commit-id> && echo "" || cat' \
--tag-name-filter cat -- --all
另一种选择是使用嫁接功能,如下所示。请注意,您可以在使用第一个命令后使用git log
或图形查看器检查结果历史记录,以验证所需结果是否正确:
echo "<initial-commit-id> " >> info/grafts # .git/info/grafts in non-bare repo
git filter-branch --tag-name-filter cat -- --all
确保在克隆为的新裸仓库中执行上述命令--mirror
。这样可以更轻松地推送所有更新的分支和标签。
不包含上述内容的旧标签/分支initial-commit-id
仍将指向旧历史。您必须删除它们才能真正摆脱旧的历史。您应该可以使用git branch --contains <previous-initial-commit-id>
和找到它们git tag --contains <previous-initial-commit-id>
。<previous-initial-commit-id>
是先前的“初始提交”的ID,重写的历史记录不再引用该ID。
完成上述所有操作后,请参阅缩小存储库清单以了解如何完全摆脱旧的历史记录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句