删除提交的父级,从而使其成为初始提交

时间:2016-01-28 03:08:06

标签: git commit git-commit git-rewrite-history git-plumbing

注意:我知道这是重写历史记录,会改变所有哈希值,并使其他人变得混乱。

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

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

3 个答案:

答案 0 :(得分:2)

git rebase -i HEAD~

然后在上面的终端cmd之后弹出的编辑器中将子提交行的开始从pick更改为squash。或者分别是'p'和's'。编写文件并退出上述命令中出现的编辑器

编辑:假设两次提交是最新的。如果没有那么你可以查看孩子的子提交哈希并使用git rebase -i HEAD~2而不是

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

答案 1 :(得分: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。如果没有这个,这个仓库仍将反映原始提交的嫁接祖先)

答案 2 :(得分:0)

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

Todo(任何人):在解释中编辑