根据您对另一个答案的评论,您是说开发看起来像这样:
C2 --- C3 --- C4 --- F2 --- C5 <-- master, origin/master (or similar)
\
W1 --- FX --- W2 --- W3 --- W4 --- W5 <-- workbranch
FX
您几周前在您的工作分支上编写了修复,以及W1
通过W5
. 他们(无论谁控制origin/master
或origin/feature
或任何你在一个分支上工作)终于开始提交它,也许还有上面的其他提交(C3
通过C5
)。因为它是不同的提交(即使它做出了相同的更改),所以我将它标记为F2
.
你可以在上面重新设置你的分支,F2
但这必然会让你得到改变,C3
至少C4
,C5
如果你也想要的话。如果这是您想要的,只需执行以下操作:
$ git rebase -i master
当你在你的workbranch
. 由于您的修复FX
已包含(尽管现在称为F2
),请从您想要保留的更改列表中删除它(pick
启动 rebase 时正在编辑的文件中的一行),然后让交互式 rebase 运行。当然,您还需要确保您的每个提交W1
仍然W5
可以独立工作,因为它们基于不同的提交(C5
上面的 )。如果不是,您可能需要再做一次rebase -i
并根据需要修复每个提交。而且,rebase 可能会遇到冲突,您必须手动解决。但假设所有这些都有效,你最终会得到这个:
C2 --- C3 --- C4 --- F2 --- C5 <-- master, origin/master (or similar)
\
W1' --- W2' ... --- W5' <-- workbranch
(从数学符号中借用的单引号'
表示这些是新的提交,它们只是与提交“做同样的事情” W1
,W2
等等。这就是这样rebase
做的:它采用现有的提交链,并创建一个新链提交,从其他地方开始,与旧链“做同样的事情”,然后从旧链中删除标签 - <code>workbranch,在这种情况下 - 并将其粘贴到新链上。)
如果幸运的话,没有“额外”提交(C3
及C4
以上):您的工作分支脱离提交 C2,那么远程“主线”上的下一个是您的修复 F2。如果提交W1
与修复工作正常,你可以这样做,例如:
$ git rebase -i <sha1-of-F2>
并再次删除pick
您提交的行FX
,因为它的内容与F2
. 在这种情况下,您将获得一个如下所示的提交树:
C2 --- F2 --- C5 <-- master, origin/master (or similar)
\
W1' --- W2' --- W3' --- W4' --- W5' <-- workbranch
在每种情况下,这里的要点都是相同的:进行新的更改链(您的“工作”),origin/whatever
在“他们”将您的错误修复提交FX
作为提交时或之后挂起一个点F2
。这里的问题也是一样的:你在 C2 分支时测试了你的工作,而新的工作链分支了其他一些提交,所以现在可能你的部分或全部工作被巧妙地破坏了。
注意:当你做 rebase 的东西时,你可以在你的原始作品上粘贴一个标签,这样可以很容易地获得原始的一系列提交(上面的W1
, FX
, W2
, ...),方法是:
git branch original-workbranch workbranch
在你开始任何变基之前。当您对“新”版本中的一切正常感到高兴时,您可以删除额外的标签:
git branch -D original-workbranch
如果您忘记或不关心这个“保存”步骤,并且稍后想要恢复原始工作分支,则可以在事后通过“参考日志”(通常为 90 天左右)完成(请参阅 参考资料git reflog --help
),但它是在这一点上做更多的工作。