樱桃选择从功能分支到修补程序分支的所有更改

问题描述 投票:0回答:1

我因 git 而陷入了困境。

设置如下:

我们有 master、stage 和 feature 分支。我们正在使用合并策略,没有挤压。 我们同时实现多个功能并将它们合并到阶段分支。每隔几天,我们就会合并所有内容以掌握并部署到生产中。


但是生产中出现了问题,我们不得不恢复 master 上的更改。所以现在 master 没有任何包含在阶段的最新合并中的更改。

我们目前的做法是:

  1. 为每个功能创建一个修补程序分支
  2. 从原始功能分支中挑选提交
  3. 合并直接掌握。

我对一个长期存在的分支有疑问(不要问我们是如何到达这里的)。基本上有一个分支,其中有一堆提交是在几周内创建的(但大部分是在一周内)。现在我想弄清楚如何选择这个提交到修补程序分支。但问题是这个功能分支还包括来自阶段的合并提交。所以一切都乱了。


我尝试了几件事。我知道该功能分支上第一次和最后一次提交的哈希值。所以我尝试做这样的事情:

git cherry-pick <hash-first>^..<hash-last>

但这不起作用。它似乎正在尝试应用不相关的提交(我猜这是因为从阶段合并到功能分支)。解决冲突后,它仅添加一个包含不相关更改的提交。我不知道发生了什么。


我也尝试只提供分支名称:

git cherry-pick ..<branch_name>

但是它说的是

error: empty commit set passed
我试着调查一下


我尝试将功能分支的副本重新设置到主分支上。因此,我检查了功能分支,从中创建了新分支,并尝试将其重新建立到主分支上。但好像没什么作用。


我现在唯一的想法是一次检查每个提交并挑选它。但这将带来大量工作并解决合并冲突。并且有可能会在舞台和大师之间造成差异。有更好的办法吗?

我使用的是 Linux(使用 WSL)。

git merge version-control
1个回答
0
投票

假设

  • feature
    分支上的第一个黑色提交点可以命名为
    F1
  • 合并到
    stage
    之前的最后一个黑色提交点可以命名为
    F9
  • main
    上的红色恢复提交点可以命名为
    M3
  • grey 对
  • 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 基本上与cherry-pick F1到F9以及cherry-pick S1到S3相同,因为默认情况下rebase会展平版本历史记录。您还可以使用

--rebase-merges

1 选项在 rebase 中“保留”来自 stage
 的合并提交。

我将保留放在引号中,因为不会保留,因为在重新使用原始合并提交时,它将创建新的、重新基础的提交。但是合并结构应该保持不变(尽管如果合并中存在冲突,并且在原始合并中手动解决了这些冲突,则需要再次手动解决它们(这是更喜欢 rebase 而不是合并的另一个原因,因为这样问题就永远不会出现))。

与上述合并相关的潜在冲突当然也会出现在纯粹的樱桃选择方法中,因此,如果您遇到冲突,您会以一种或另一种方式遇到冲突(尽管您通常会更好地获得多个较小的冲突)来自 rebase/cherry-pick 而不是来自合并的一个大的)。


1 例如git rebase --rebase-merges --onto M3 F1^ reintroduce_feature_commits


    

© www.soinside.com 2019 - 2024. All rights reserved.