虽然有几个主题涉及类似的问题,但我似乎无法用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+分支的历史。应该有一个选项,就是在我想要作为第一次提交的提交之前“分割”提交树。
发布于 2013-09-16 10:34:16
因此,从本质上说,您想要做的是比某个提交更早地切断历史。在Git术语中,这意味着您希望重写该提交,从具有父级到没有父级(是新历史的开始提交)。
这可以使用git滤波器-分支来完成,如下所示:
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克隆的新的repo中执行上述命令。这样可以更容易地推送所有更新的分支和标记。
不包括上述initial-commit-id的旧标记/分支仍然指向旧的历史记录。你必须删除它们,才能真正摆脱过去的历史。您应该能够使用git branch --contains <previous-initial-commit-id>和git tag --contains <previous-initial-commit-id>找到它们。<previous-initial-commit-id>是以前的“初始提交”的ID,重写的历史不再引用该ID。
完成上述所有操作后,请参阅缩小库的检查表,以了解如何彻底消除旧历史。
发布于 2013-09-16 09:09:02
如果我必须这么做,我只会写:
git rebase -i <initialCommitOfTheTree>壁球都是你想要的。是的,如果您必须编辑300行代码,这是非常困难的工作,但是您可以将其快速解析到vim或其他文本编辑器中,并用s替换所有想要更改的行的开头部分。
就像@mnagel说的,你应该有一个很好的理由。
干杯。
维托。
发布于 2013-09-16 10:28:38
根据您的回购可能是可行的启动一个新的回购,复制文件从“新的初始提交”那里,并使它成为一个新的提交。然后添加现有的回购作为一个远程和cherrypick所有以后提交到您的新回购。如果您在“新初始提交”之后具有线性历史记录,这应该会相当顺利。
也许对更复杂的布局来说,重新设置提交(而不是筛选)可以正常工作,但我并不经常这样做,所以我不想在这里提出建议。
https://stackoverflow.com/questions/18823843
复制相似问题