注意:我知道这是在改写历史,会改变所有的哈希值,把其他人搞砸。
我想提交,并删除其父级。具体来说,提交现在应该看起来像一个初始提交。这意味着它的差异会改变;在历史上的那个时刻,看起来所有文件都是由该提交创建的。
如何做到这一点?(当然,我可以去编辑提交对象,但是提交不会相互指向。)另外,我想在一个新分支上执行此操作(这意味着现在有两个历史记录:原始的一个,另一个提交是初始提交。)
注意:我知道这是在改写历史,会改变所有的哈希值,把其他人搞砸。
我想提交,并删除其父级。具体来说,提交现在应该看起来像一个初始提交。这意味着它的差异会改变;在历史上的那个时刻,看起来所有文件都是由该提交创建的。
如何做到这一点?(当然,我可以去编辑提交对象,但是提交不会相互指向。)另外,我想在一个新分支上执行此操作(这意味着现在有两个历史记录:原始的一个,另一个提交是初始提交。)
git checkout -b newbranch
git rev-parse @ >.git/info/grafts # any equivalent for @ will work e.g. HEAD or newbranch
git filter-branch
rm .git/info/grafts
(编辑:添加了rm
. 没有那个,这个 repo 仍然会反映原始提交的嫁接祖先)
git rebase -i HEAD~
然后在上面终端cmd之后弹出的编辑器中将child commit line的开始从pick改为squash。或分别为“p”和“s”。写入文件并退出上述命令出现的编辑器
编辑:假设这两个提交是最新的。如果没有,那么您可以检查孩子的孩子提交哈希并改用 git rebase -i HEAD~2
Edit2:或者你可以 git rebase -i parentcommithash 并且列表的顶部应该是父级
假设您希望新的初始提交为123456
.
git checkout -b new_master
git filter-branch --commit-filter '
if git merge-base --is-ancestor 123456 $GIT_COMMIT ;
then
git commit-tree "$@";
else
skip_commit "$@";
fi' HEAD
待办事项(适用于任何人):编辑说明