3

注意:我知道这是在改写历史,会改变所有的哈希值,把其他人搞砸。


我想提交,并删除其父级。具体来说,提交现在应该看起来像一个初始提交。这意味着它的差异会改变;在历史上的那个时刻,看起来所有文件都是由该提交创建的。

如何做到这一点?(当然,我可以去编辑提交对象,但是提交不会相互指向。)另外,我想在一个新分支上执行此操作(这意味着现在有两个历史记录:原始的一个,另一个提交是初始提交。)

4

3 回答 3

2
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 仍然会反映原始提交的嫁接祖先)

于 2016-01-28T04:20:56.490 回答
2

git rebase -i HEAD~

然后在上面终端cmd之后弹出的编辑器中将child commit line的开始从pick改为squash。或分别为“p”和“s”。写入文件并退出上述命令出现的编辑器

编辑:假设这两个提交是最新的。如果没有,那么您可以检查孩子的孩子提交哈希并改用 git rebase -i HEAD~2

Edit2:或者你可以 git rebase -i parentcommithash 并且列表的顶部应该是父级

于 2016-01-28T03:18:20.263 回答
1

假设您希望新的初始提交为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

待办事项(适用于任何人):编辑说明

于 2016-01-28T04:07:12.987 回答