修改了子模块中的一些提交消息后,我认为我还应该更新父存储库修复损坏的引用。
所以我对父存储库进行了交互式重置。我想修改父存储库中的两个提交,它们是指子模块中的另外两个提交,例如:
--- 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 status
说changed 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 add
和 git 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 立即提交?
(我自己被这个。我觉得这很烦人。(