如何修改连续提交,以便他们引用其他子模块提交



修改了子模块中的一些提交消息后,我认为我还应该更新父存储库修复损坏的引用。

所以我对父存储库进行了交互式重置。我想修改父存储库中的两个提交,它们是指子模块中的另外两个提交,例如:

--- a --- b --- c --- d ---父母   ||   v v--- a --- b --- sub 

因此,我做git rebase -i A^并选择编辑A和B:

编辑...编辑B ...选择C ...选择D ... 

现在我在提交A。要还原正确的子模块提交ID,我首先检查相关的suppodule提交,然后在父存储库中修改提交。

$ cd sub/
$ git checkout a
$ cd ..
$ git add sub
$ git commit --amend

看起来不错,所以我继续进行下一个:

$ git rebase --continue

现在它抱怨它无法合并。在这里,我从本地消息中的翻译:

错误合并子模块子(提交不遵循任何合并基础(自动合并冲突(suppoule(:sub中的冲突错误:无法应用B(B的提交消息(手动解决所有冲突,将其标记为解决" git add/rm",然后运行" git rebase -continue"。您可以跳过此提交:运行" git rebase -skip"。为了在" git rebase"之前流产并回到州,请运行" git rebase -abort"。无法应用B(B的提交消息(

公平。第二个提交因第一个变化的子模块ID而失去了与第一个提交的联系。git statuschanged by both: sub。毫不犹豫地,我试图再次修改:

$ cd sub/
$ git checkout b
$ cd ..
$ git add sub
$ git commit --amend

不幸的是,这并不能做我想要的。原因是错误的git rebase --continue以某种方式完全吃了b。B的更改位于舞台区域,但提交已经消失了。因此,第二个git commit --amend将修改A,并将B中的所有更改都放入A!现在我想我可以在那时创建一个新的提交,复制B。

如何正确修改子模块参考?为什么以及在哪些情况下都这样重新销毁销售委员会?

tl; dr:在没有 --amend 的情况下使用 git commit 使用git rebase --continue,它将在没有--amend的情况下进行git commit

更长

让我们拍摄原始图,减去与子模块的连接(因为它们是脆弱的并妨碍了:-)(:

...--o--A--B--C--D   <-- branch

您运行git rebase -i A^,然后将A更改为edit(等(。将A的Cherry-Picks rebase CC_14 A'

...--o--A--B--C--D   <-- branch
      
       A'  <-- HEAD

您进行更新, git addgit commit --amend制作新的 A",将 A'留在后面,因为放弃:

       A"   <-- HEAD
      /
...--o--A--B--C--D   <-- branch
      
       A'

现在,无论您为B的说明提供了什么,Git 尝试复制B 但失败。因此,反弹停止了:

       A"   <-- HEAD
      /
...--o--A--B--C--D   <-- branch
      
       A'

随着索引和工作树的一些不承诺的更改。尚无提交B'您现在可以做两件事。一个是自己做:

<fix the submodule>
git add sub
git commit

这创建B'

       A"-B'   <-- HEAD
      /
...--o--A--B--C--D   <-- branch
      
       A'

现在,您可以将git git继续执行下一个说明(因此,您最初不需要要求编辑B,您可以继续将C复制到C'现在:如果Git现在停止要让您编辑B'您可以告诉它继续(。

另一个 - git commit现在要求您输入提交消息 - 要设置所有内容,而不是git commit,而是运行git rebase --continue,以使GIT MAKE MAKE B'

<fix the submodule>
git add sub
git rebase --continue

--continue步骤注意到所有冲突均已解决(或者如果不这样做,则抱怨并停止(,然后进行git commit并继续进行,就像您将其提交自己一样。

摘要

您需要edit作为指示,以使rebase停止,让您--amend将成功成功。您不需要 edit,以便在樱桃之前将 fail 进行提交,因为GIT将在没有首先提交的情况下停止。

很难事先知道 - 在某些情况下,可能是不可能的 - 知道哪些樱桃要成功并会失败。因此,您必须要大量注意git rebase停止之前发出的确切消息,让您做某事:它停止了,因为樱桃pick 失败了,或者它停止了您告诉它在樱桃 - pick 成功之后停止吗?,换句话说,是否有一个提案,您现在应该--amend,还是您(有Git(应该做一个新的 new 立即提交?

(我自己被这个。我觉得这很烦人。(

相关内容

最新更新