我们说分支集成,其中提交已测试的代码,然后为所有新功能(不稳定)提交forTesting分支。由于第x天的某种原因,forTesting意外地合并到集成中,而没有任何人注意。之后,在集成和forTesting分支上已经发生了多次提交。
假设我们有branchFeatureX,它在意外合并之前已合并到forTesting分支。现在,当我们希望将此分支合并到集成中时,会出现“已经更新”错误。
如何解决此问题而又不丢失集成分支中的前向提交?
答案 0 :(得分:1)
如果历史上发生错误的地方不太远,则可以考虑以下恢复过程:
1)从您的母版创建一个修订分支,并对其进行处理,以使其更加安全
2)git log
在合并前查找所有出错的最后一次提交。复制或记录提交哈希以供进一步使用。
3)git reset --hard <commit_hash_you_spotted_as_good>
4)然后,对于自那时以来开发的每个功能,您都想回来,让我们考虑两种可能性: (此时,您可以查看日志或树的图形表示,但我建议后者)
a)分支是在错误之前从主节点创建的:
->只需将此功能合并到fix分支中,应该非常简单
b)分支是根据已经损坏的master版本创建的
-> git再次登录以记下该分支上的每个提交,并使用git cherry-pick <commit_id>
4)测试您的修订分支上的所有内容,以确保一切都恢复正常
5)然后回到master分支,像对fix分支一样重设它(最后一次提交很好),然后将fix分支合并到
答案 1 :(得分:1)
由于您将featureX
分支合并到fortesting
分支中,然后将fortesting
分支合并到integration
分支中,这意味着对featureX
分支的更改已经引入integration
分支。因此,当您将featureX
分支合并到fortesting
分支中时,git将显示Already up-to-date
。
现在的提交历史记录应如下图所示:
...---A---B---C---K---...---L integration
/
...---C---D---G---H---I---J---...---M---...---N fortesting
\ /
E-------F featureX
如果您想基于featureX
分支的最新版本将integration
到integration
分支的更改引入,则可以使用以下命令:
# On integration branch
git cherry-pick <latest commit from featureX branch>
作为以上示例中的命令git cherry-pick <commit F>
。
提交历史看起来就像(提交O
将更改从featureX
分支应用到integration
分支):
...---A---B---C---K---...---L---O integration
/
...---C---D---G---H---I---J---...---M---...---N fortesting
\ /
E-------F featureX