我因 git 而陷入了困境。
设置如下:
我们有 master、stage 和 feature 分支。我们正在使用合并策略,没有挤压。 我们同时实现多个功能并将它们合并到阶段分支。每隔几天,我们就会合并所有内容以掌握并部署到生产中。
但是生产中出现了问题,我们不得不恢复 master 上的更改。所以现在 master 没有任何包含在阶段的最新合并中的更改。
我们目前的做法是:
我对一个长期存在的分支有疑问(不要问我们是如何到达这里的)。基本上有一个分支,其中有一堆提交是在几周内创建的(但大部分是在一周内)。现在我想弄清楚如何选择这个提交到修补程序分支。但问题是这个功能分支还包括来自阶段的合并提交。所以一切都乱了。
我尝试了几件事。我知道该功能分支上第一次和最后一次提交的哈希值。所以我尝试做这样的事情:
git cherry-pick <hash-first>^..<hash-last>
但这不起作用。它似乎正在尝试应用不相关的提交(我猜这是因为从阶段合并到功能分支)。解决冲突后,它仅添加一个包含不相关更改的提交。我不知道发生了什么。
我也尝试只提供分支名称:
git cherry-pick ..<branch_name>
但是它说的是
error: empty commit set passed
我试着调查一下
我尝试将功能分支的副本重新设置到主分支上。因此,我检查了功能分支,从中创建了新分支,并尝试将其重新建立到主分支上。但好像没什么作用。
我现在唯一的想法是一次检查每个提交并挑选它。但这将带来大量工作并解决合并冲突。并且有可能会在舞台和大师之间造成差异。有更好的办法吗?
我使用的是 Linux(使用 WSL)。
假设
feature
分支上的第一个黑色提交点可以命名为F1
。stage
之前的最后一个黑色提交点可以命名为 F9
。main
上的红色恢复提交点可以命名为
M3
。
stage
的承诺是
S1
、
S2
和
S3
。
将所有提交从
feature
重新引入到main
(又名“带有樱桃选择的分支”)
git branch reintroduce_feature_commits F9
git rebase --onto M3 F1^ reintroduce_feature_commits
(您也可以使用--onto main
代替
--onto M3
)
F1^
表示
F1
的父级,因为 rebase 语法是
--onto <target_commit> <start_commit_NOT_including> <branch_to_rebase>
。
--rebase-merges
stage
的合并提交。我将保留放在引号中,因为不会保留,因为在重新使用原始合并提交时,它将创建新的、重新基础的提交。但是合并结构应该保持不变(尽管如果合并中存在冲突,并且在原始合并中手动解决了这些冲突,则需要再次手动解决它们(这是更喜欢 rebase 而不是合并的另一个原因,因为这样问题就永远不会出现))。
与上述合并相关的潜在冲突当然也会出现在纯粹的樱桃选择方法中,因此,如果您遇到冲突,您会以一种或另一种方式遇到冲突(尽管您通常会更好地获得多个较小的冲突)来自 rebase/cherry-pick 而不是来自合并的一个大的)。
1
例如git rebase --rebase-merges --onto M3 F1^ reintroduce_feature_commits