“挑选合并”最简单的方法

6

我知道标题有点模糊 - 因此加了引号!

假设我有一个分支b_feature,这个分支是从主开发分支b_master创建的,并已经合并回去。现在存在另一个分支b_release,我希望将这些更改添加到该分支中(作为一个点发布)。b_masterb_release已经分叉,不会再次合并。

---------Bm----k1-----Mm-----> b_master (k1 isn't to be included in b_release)
 \        \          /
  \        c1--c2--c3  (b_feature)
   \
    \----Br---------Mr-----> b_release
          \        / 
           cA-cB-cC

我知道我可以使用git cherry-pick -m Mm将整个内容作为单个diff进行挑选,得到:

     ----Br--Squashed----> b_release

其中Squashed是一个包含所有功能更改的提交,合并消息为Mm

但如果我想保留更改历史记录和单独的提交消息怎么办? 我可以使用以下大致工作流手动挑选:

git checkout b_release
git checkout -b b_release_feature
git cherry-pick c1^..c3
git checkout b_release
git merge b_release_feature
git commit --amend --reedit-message=Mm
git branch -d b_release_feature

但这似乎是一个笨拙的解决办法,而我不知道更优雅的解决方案!

rebase --onto b_release Bm Mm也似乎不能产生我想要的结果。

有更好的方法吗?

2个回答

1

我认为在这里使用rebase比cherry-pick更合适,尽管它们之间的差异很小。以下是我会如何操作。首先将b_release_feature分支附加到源分支,然后将其rebase到目标分支。

git checkout -b b_release_feature c3
git rebase --onto b_release c1^ b_release_feature
git checkout b_release
git merge b_release_feature
git commit --amend --reedit-message=Mm
git branch -d b_release_feature

0
但是如果我想保留修改历史记录和单个提交信息呢? 那么,我认为没有理由不创建一个真正的合并到 b_release
git checkout b_release
git merge ":/c3"

给你

---------Bm----k1-----Mm-----> b_master (k1 isn't to be included in b_release)
 \        \
  \        c1--c2--c3 \
   \                   \
    \----Br---------Mr--Mc3---> b_release
          \        /
           cA-cB-cC

然后(不知道你为什么需要这条消息)

message=$(git log -1 --format=%B ":/Merge branch 'b_feature'")
git commit --amend --message="$message"

在历史记录中有多个提交具有相同的消息和相同的更改(差异)会让人感到困惑。有时需要这样做是因为您必须进行樱桃拣选,但我认为这不是这种情况。

设置

git init
git commit --allow-empty -mInit
git commit --allow-empty -m'After init'
git commit --allow-empty -mBm
git commit --allow-empty -mk1
git checkout -b
git checkout @~
git checkout -b b_feature
git commit --allow-empty -mc1
git commit --allow-empty -mc2
git commit --allow-empty -mc3
git checkout main
git merge --no-ff b_feature
git checkout ':/After init'
git checkout -b b_release
git commit --allow-empty -mBr
git checkout -b other
git commit --allow-empty -mCa
git commit --allow-empty -mCb
git commit --allow-empty -mCc
git checkout -
git merge --no-ff other
git checkout main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接