在Git中拆分第一个提交

19

我想要分离我的git仓库中的第一个提交,但是我不能使用rebase来完成这个操作,因为它需要指定一个父节点。我发现在Git中编辑根提交对修改第一个提交很有用,但不适用于分离它。我该怎么做?


2
我无法回答,因为问题已关闭,但在我看来它不应该关闭,因为其他答案并没有涉及到分割。我找到的方法是:执行 git rebase --root -i,在根提交之前添加一个 bbreak 行,并使用 s / skip 标记根提交。这样,重定位会在任何提交之前停止,您可以使用 get checkout <root hash> -- . 从根提交获取代码,并像通常一样进行拆分。 - bogdanb
2个回答

15
你可以直接按照你所链接的问题中提到的步骤进行操作,在检查完根提交后,使用git commit --amend命令修改原始提交,然后使用git commit命令在继续重定位操作之前创建一个额外的提交。
根据你想要拆分提交的方式,你可以使用git rm --cached命令删除你想要在第二次提交中添加的文件,在初始的git commit --amend之前编辑任何你希望看起来不同的文件,并在这些文件上调用git add,再一次在调用git commit --amend之前。
在调用git commit --amend之后,为了确保你提交了与原始根提交完全相同的状态,你可以调用以下命令:
git checkout <sha1-of-original-root> -- .

在调用 git commit 以创建分割根提交的第二次提交之前。


1
在这里你不想使用 git reset --hard。你可以使用 git reset <原始根的sha1值> -- .,但这只会“恢复”索引而不是工作树。最好的方法可能是 git checkout <原始根的sha1值> -- .,它将更新索引和工作树,但不会改变 HEAD(让你准备提交拆分的第二部分(原始根)提交)。这里的主要思想是,resetcheckout 都会改变 HEAD,除非你给它们一个路径参数。 - Chris Johnsen
@Chris Johnsen:您说得完全正确。我曾考虑过两个阶段的重置,先是路径,然后是--hard,但实际上并没有写出来。检出解决方案更好。 - CB Bailey
我认为应该明确指出,在修改第一个提交之前,您需要从工作目录中删除所有应该进入第二个提交的文件。这似乎很可怕,但实际上并不是。在修改后,您可以使用 git checkout <sha1-of-original-root> -- . 将它们恢复回来。事先记下原始根提交的哈希值是值得注意的,以便随时掌握。 - mdcq

5
您可以使用--root选项告诉rebase您想要重写根/第一个提交:
$ git rebase --interactive --root

然后根提交将出现在变基待办事项列表中,您可以选择编辑它:

edit <root commit sha> <original message>
pick <other commit sha> <message>
...

这是关于--root的解释,来自Git rebase文档
重新设置所有可以从<branch>到达的提交记录,而不是仅限于一个<upstream>。这允许您在分支上重新设置根提交记录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接