2

假设我有一个标签,v1.5. 进行了更多提交,并fix在 tag 之前的某个点创建了另一个分支v1.5

现在fix已经进行了修复,需要将其应用于由标记提交表示的代码的发布版本1.5

是否可以在不使用的情况下git-cherry-pick合并fix历史中给定点的大量提交?

o  ... (history)
|
o  tag v1.5
|
o (can not have in v1.5)
|
o (can not have in v1.5)
|
o (can not have in v1.5)
|\
| \ (`fix` branch)
|  \
|   o (needed at v1.5)
o   | -(can not have in v1.5)
|   o (needed at v1.5)
|   |
|   o (needed at v1.5)
o   | -(can not have in v1.5)
    o (needed at v1.5)
4

1 回答 1

4

是的,这可以通过 rebase 而不是cherry-pick来实现。无论使用哪种方法,最终结果都应该是相同的。

首先为 fix 分支创建一个新名称,使原来的 fix 分支保持不变

git branch fixv1.5 fix

然后将 fixv1.5 重新定位到 v1.5

git rebase --onto v1.5 <upstream> fixv1.5

其中<upstream>应该是修复分支所基于的提交的 SHA,即下图中标记为 P 的那个。

现在你应该有一个看起来像这样的历史:

o  ... (history)
|
o  tag v1.5
| \
|  \   A'  B'  C'  D'
|   ---o---o---o---o  fixv1.5
|
o (can not have in v1.5)
|
o (can not have in v1.5)
|
o (can not have in v1.5) P
|\
| \ (`fix` branch)
|  \
|   o (needed at v1.5) A
o   | -(can not have in v1.5)
|   o (needed at v1.5) B
|   |
|   o (needed at v1.5) C
o   | -(can not have in v1.5)
    o (needed at v1.5) D

为了完整起见,cherry-pick 的等效使用将是

git checkout -b fixv1.5 v1.5
git cherry-pick <upstream>..fix
于 2014-01-23T16:25:03.467 回答