我们的团队遇到了一个小问题.一个开发者必须在我们的开发分支中包含一些变化.在这之前,他意外地合并了一个功能分支(当时不应该合并)并继续处理这些更改,在合并后生成几个提交.
现在我们要保留这些更改,但在合并完成之前将它们应用于提交.要明确:
A (+b, +a)
|
B (+a)
|
C (merge commit)
|\
D \
| E (feature branch)
| /
|/
F
Run Code Online (Sandbox Code Playgroud)
我们想要在提交D上应用他的更改(+ a,+ b).相当于:
C (+a,+b)
|
D
| E (feature branch)
| /
|/
F
Run Code Online (Sandbox Code Playgroud)
我们如何提交更改以解除之前的合并以保持本地更改?
Ash*_*son 15
这是一份工作git rebase -i.跑:
git rebase -i F
Run Code Online (Sandbox Code Playgroud)
您将看到一个提交列表${EDITOR},如下所示:
pick 334ad92 D
pick fb54c42 E
pick 6901e51 B
pick 6c61a52 A
# Rebase eea2847..6c61a52 onto eea2847
#
# (more instructions here)
Run Code Online (Sandbox Code Playgroud)
删除该pick fb54c42 E行以删除该提交.(另外,如果您希望A并将B其合并为一个提交,则可以将pick命令更改为squash- squash 6c61a52 A).保存并关闭文件,您的分支将处于您希望的状态.
请注意,这将改变历史记录.这意味着git push -f如果你已经将分支推到了任何地方,你就需要做一个,并且它会与在这个分支上合作的任何其他人混乱.如果这是一个问题,您可以git revert改为合并提交:
git revert -m 1 C
Run Code Online (Sandbox Code Playgroud)
该-m 1参数告诉git恢复提交的第一个父级,这是合并到的一侧(D在图中).
我无法理解时间线在你的例子中有什么方向(在此之前做出了提交)所以我将用广义的术语解释:
git cherry-pick A然后B在合并提交中引入deveoper所做的更改.到现在为止,您的新分支包含了它应该查看的历史记录,因此您现在可能git reset --hard将原始分支包含到此状态.请注意,强制将其推送到共享存储库并由其他开发人员获取它将对他们产生明显的影响:每个人都git rebase必须根据该分支的旧状态到其新状态进行任何工作.
您可能还想从"固定"分支"重新创建"功能分支.正如我所说,我没有看到它是否在违规提交之前分叉.如果之前完成,则无需修复功能分支.
| 归档时间: |
|
| 查看次数: |
18018 次 |
| 最近记录: |