我会说您有两种可能性:一种将 1.0.4 作为悬空提交留在其自己的分支中,另一种将您以后的所有提交重新定位在该新分支之上,然后将其丢弃。
第一个意思是:
$ git checkout v1.0.3
$ git checkout -b patch-for-1.0.4
# ... edit files ...
$ git commit -a -m 'Patch for 1.0.4'
$ git tag v1.0.4
在此之后,您的标签 v1.0.4 不在 master 分支中,但可以在 repo 中找到,您可以从中发布。您只需要注意不要删除分支patch-for-1.0.4。
第二个意思是做前面提到的,然后继续:
$ git checkout master
$ git rebase patch-for-1.0.4
# ... solve conflicts ...
$ git branch -d patch-for-1.0.4
这假设从 1.0.3 到 1.1.0 的所有提交都在 master 上完成。如果你预计会有很多冲突,你可能想先在 master 上的一个分支上测试这个,或者做一个--interactive rebase。
第二种选择更简洁,您可以删除patch-for-v1.0.4 分支;但它需要在新提交之上重新构建旧提交,这并不是每个人都喜欢做的事情,特别是如果你在一个团队中工作。
编辑:
这是你的起始情况:
A -------- B - C - D ( ... will become v1.1.0)
(v1.0.3)
第一个 sn-p 创建一个补丁并将其作为悬空提交留在自己的分支中:
A -------- B - C - D
\
--- E
(v1.0.4)
如果此时进行合并,您将得到:
A --------- B - C - D --------- E
(v1.0.3) (v1.1.0) (v1.0.4)
为了避免E 被放在B - C - D 提交之上,做一个rebase:
A --------- E ------- B' - C' - D'
(v.1.0.3) (v1.0.4) (v1.1.0)
请注意,此更改将B - C - D 提交到B' - C' - D',它们具有相同的内容(冲突修复除外),但哈希值不同,因为它们现在位于E 之上,而不是A。这可能会破坏您团队中其他人的 master 分支或他们的功能分支,但会按照逻辑顺序进行。