【问题标题】:Splitting the first commit in git [duplicate]在 git 中拆分第一个提交 [重复]
【发布时间】:2011-04-11 08:59:10
【问题描述】:

我想拆分我的 git 存储库中的第一个提交,但我不能使用 rebase 来执行此操作,因为需要父节点。我发现Edit the root commit in Git? 对修改第一个提交很有用,但不能拆分它。怎么拆分?

【问题讨论】:

  • 我无法回答,因为问题已关闭,但 IMO 不应该如此,因为其他答案没有询问拆分问题。我找到的方法是:做一个git rebase --root -i,在根提交前添加bbreak行,并用s/skip标记根提交。这样你 rebase 在任何提交之前停止,你可以使用get checkout <root hash> -- . 从根提交中获取代码,并像通常的拆分一样继续。

标签: git


【解决方案1】:

您可以在链接到的问题中遵循完全相同的过程,但在检查根提交后,您可以使用 git commit --amend 修改原始提交,然后在继续之前使用 git commit 进行额外提交使用 rebase 命令。

根据您想要拆分提交的方式,您可以使用git rm --cached 删除要在初始git commit --amend 之前的第二次提交时添加的文件,并在调用@987654325 之前编辑您希望看起来不同的任何文件@ 在这些文件上,再次调用git commit --amend

调用git commit --amend 后,为了确保您提交的状态与您可以调用的原始根提交的状态完全相同:

git checkout <sha1-of-original-root> -- .

在调用git commit 进行拆分根提交的第二次提交之前。

【讨论】:

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

您可以使用--root 选项告诉rebase 您要重写根/首次提交:

$ git rebase --interactive --root

然后根提交将显示在rebase TODO列表中,您可以选择对其进行编辑:

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

这是the Git rebase docs--root的解释:

对所有可从&lt;branch&gt; 访问的提交重新设置基准,而不是用&lt;upstream&gt; 限制它们。这允许您在分支上重新设置根提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2020-12-12
    • 2020-09-06
    • 2010-11-29
    相关资源
    最近更新 更多