Git 移动合并提交(分支的第一次提交)
我目前在该州拥有回购协议:Git 移动合并提交(分支的第一次提交),git,Git,我目前在该州拥有回购协议: …a——b——c——d——e BranchA \ …h——i——m——n——o BranchC ^ | BranchB Head …a——b——c——d——e BranchA \ …h——i——————————m——n——o BranchC ^ | BranchB Head 并希望获得以下状态: …a——b——c——d——e BranchA \ …h——i——m——
…a——b——c——d——e BranchA
\
…h——i——m——n——o BranchC
^
|
BranchB Head
…a——b——c——d——e BranchA
\
…h——i——————————m——n——o BranchC
^
|
BranchB Head
并希望获得以下状态:
…a——b——c——d——e BranchA
\
…h——i——m——n——o BranchC
^
|
BranchB Head
…a——b——c——d——e BranchA
\
…h——i——————————m——n——o BranchC
^
|
BranchB Head
我知道如何重新设置分支的基础以移动提交,但我只想“重新设置”branch,而不是BranchB
我将如何做到这一点?仅使用
rebase
无法实现您想要的。在初始状态下,commitm
有两个父级:b
和i
。在所需状态下,is具有不同的父级:e
和i
。事实上,处于所需状态的m
与处于初始状态的m
是完全不同的提交
将
e
合并到i
中,然后在新提交的基础上重新设置n
和o
。丢弃旧的m
、n
和o
您可以运行以下命令:
# Create a backup branch on commit `o`
# It is useful to restore the original status of the repo if something goes wrong
$ git branch backupC BranchC
# Create a working branch on commit `i` and check it out
$ git checkout -b work BranchB
# Merge `e` into `i`
$ git merge BranchA
# Rebase the last 2 commits of BranchC on top of the new branch
$ git rebase --onto work BranchC~2 BranchC
就这些。当前分支现在是BranchC
。如果您对结果满意,现在可以删除分支backup
和work
:
$ git branch -D backup work
当备份
分支被删除时,旧的提交m
、n
和o
将无法访问
但是,如果出现问题(冲突)并且git merge
或git rebase
无法完成,您可以通过运行git rebase--abort
或git merge--abort
(取决于失败的命令)中止进程并恢复初始状态,然后:
将
e
合并到i
中,然后在新提交的基础上重新设置n
和o
。丢弃旧的m
、n
和o
@axiac write作为答案?此外,重定基址将使n
和o
无法访问,因此它们将被有效地“丢弃”。这很好。我只是错过了最初的合并。rebase允许我逐个提交解决冲突,这太完美了。谢谢