如何更改 git 中的非常早的提交?
How to change a very early commit in git?
假设我在我的主分支中有几个提交 A-G。基于提交 E,我创建了两个分支 branchA
和 branchB
,基于提交 F,我创建了一个分支 branchC
。假设我在提交 D(在分支 master 上)中引入了一个严重错误,需要在 branchA
、branchB
和 branchC
中处理。
我知道如何更改提交 D 并解决那里的错误(使用 git rebase -i C
)- 提供新的提交历史 A-B-C-D'-E'-F'-G'。但是,这不会影响我任何分支机构的历史记录。需要明确的是:branchA
和 branchB
仍然基于 E 而不是基于重写的提交 E',这会破坏存储库结构。这不是我想要的 - 我更想要完整的树,更新 D' 之后的所有内容。
我该如何解决这种情况?在这里修改 master 分支的历史是正确的想法吗?
你不能那样做。 git 不是为重写历史而设计的。但它是为强大的分支和合并而设计的。如果修复很小,我建议你引入一个新的提交来修复程序到 master 分支,然后你 cherry-pick 提交到其他需要修复的分支。
如果你想要一个干净的历史记录,你可以在 D'
:
之上重新设置你的每个分支
git rebase D' branchA
git rebase D' branchB
为了确保你没有弄错,你可以事后检查分支前后的区别(git diff <sha1_of_branchA_before>..branchA
)。
如果您已经与其他人共享了这些分支,则可能不太理想。如果是这种情况,您可能更愿意 cherry-pick 在每个分支中打一个补丁。但好处是你会知道无论何时签出一个旧的提交,你都不会落在一个伪造的提交上(只要你签出一个分支可访问的提交,显然)
假设我在我的主分支中有几个提交 A-G。基于提交 E,我创建了两个分支 branchA
和 branchB
,基于提交 F,我创建了一个分支 branchC
。假设我在提交 D(在分支 master 上)中引入了一个严重错误,需要在 branchA
、branchB
和 branchC
中处理。
我知道如何更改提交 D 并解决那里的错误(使用 git rebase -i C
)- 提供新的提交历史 A-B-C-D'-E'-F'-G'。但是,这不会影响我任何分支机构的历史记录。需要明确的是:branchA
和 branchB
仍然基于 E 而不是基于重写的提交 E',这会破坏存储库结构。这不是我想要的 - 我更想要完整的树,更新 D' 之后的所有内容。
我该如何解决这种情况?在这里修改 master 分支的历史是正确的想法吗?
你不能那样做。 git 不是为重写历史而设计的。但它是为强大的分支和合并而设计的。如果修复很小,我建议你引入一个新的提交来修复程序到 master 分支,然后你 cherry-pick 提交到其他需要修复的分支。
如果你想要一个干净的历史记录,你可以在 D'
:
git rebase D' branchA
git rebase D' branchB
为了确保你没有弄错,你可以事后检查分支前后的区别(git diff <sha1_of_branchA_before>..branchA
)。
如果您已经与其他人共享了这些分支,则可能不太理想。如果是这种情况,您可能更愿意 cherry-pick 在每个分支中打一个补丁。但好处是你会知道无论何时签出一个旧的提交,你都不会落在一个伪造的提交上(只要你签出一个分支可访问的提交,显然)