挑选性合并是否是将主题分支修复回溯和整合的正确方式?

3
假设我想要在GitHub上修复一个开源项目,以下是我的工作流程:
1. 在GitHub上fork源项目 2. 将fork的项目克隆到本地 3. 从主分支创建一个主题分支 4. 进行修改(这里略去不必要的细节) 5. 将主题分支推送到GitHub上 6. 向原始项目提交拉取请求
如果我已经多次这样做了,我就会有一些主题分支,如issue#123和issue#456。除了主干之外,原始项目还有发布分支,例如1.0、1.1等。
我有自己独立的项目,使用的是此开源项目的1.1版本。我不想构建针对开源项目的"master",因为它尚不稳定。我需要的是一个本地构建的开源项目的1.1分支,其中包括我的问题#123和问题#456的解决方案。
我目前正在执行的操作是创建一个名为my-1.1的本地分支(从1.1分支中创建),将我的主题分支中的修复程序挑选出来,然后构建并将结果用于我的独立项目。
我不确定这里是否100%应该使用cherry-picking,但合并似乎不正确,因为我不希望"my-1.1"分支中流入来自主干之后的所有更改(这些更改存在于我的主题分支中)。这是否是最佳方法?需要注意的事项有哪些?
我唯一能想到的其他方法是为每个修复创建两个重复的主题分支,一个从主干创建,另一个从1.1创建。然后,我可以将基于1.1的主题分支合并到my-1.1中,而不是从基于主干的主题分支中挑选提交。但是这似乎很麻烦。
2个回答

1
你需要做的是将你的主题分支从最旧的分支上分离出来,然后再合并到两个分支中,而不会意外地包含新的内容。换句话说,先在1.1中进行修复,然后再将其合并到主分支中,而不是反过来。

嗯,但我想将我的主题分支推送到我的Github分支上,并从那里向原始源项目的主分支提交拉取请求。如果我的主题分支是基于1.1的,这样做可以吗?(对于可能愚蠢的问题感到抱歉;仍在努力掌握Git...) - Andy Dennie
这取决于维护者。他们可能会接受基于1.1的请求,或者你可以将其合并或变基到你的“主分支”上,并将其提交为拉取请求。 - Karl Bielefeldt
但是,1.1版本中是否可能包含(除了我的修复之外)不应该进入主分支的提交?如果我将基于1.1的主题分支合并到主分支中,主分支将会得到更多东西,对吧?也就是说,它将获得自从1.1与主分支分叉后的所有内容,以及我的修复。如果我有什么误解,请见谅。 - Andy Dennie
通常,所有进入维护分支的内容也会合并到开发分支中,但如果没有合并,你可以使用 git merge-base 来查找它们最后一次共同点并从那里创建一个新分支。 - Karl Bielefeldt

1
不,这是使用git rebase的完美用例。假设您的主题分支是从master分支分支出来的topic123。您希望它分支出自1.1。只需执行此命令:
git rebase --onto 1.1 master topic123

假设topic123不依赖于在1.1master之间引入的代码,那么一切都会很顺利。如果它确实依赖于该代码,则整个过程将失败,因为您依赖于1.1发布后的代码。
git checkout 1.1 && git merge topic123

对于所有的主题分支都要重复这个过程。你已经在远程仓库的分支上发出了拉取请求,所以只要你在本地分支上的编码工作完成了,那么它们具有较旧的合并基础就不是什么大问题了。话虽如此,如果你想把它们放回到master之上,只需反转参数即可:

git rebase --onto master 1.1 topic123

或者,如果您不想处理强制推送,可以重置为远程副本:

git reset --hard <repo>/topic123

好的,我必须仔细重新阅读rebase手册,但现在我明白了(或者说,我比以前更明白了)。然而,我是否仍然希望有一个单独的my-1.1分支来包含我的累积1.1修复,与1.1分支不同?看起来我想保持一个“干净”的1.1,可以与上游/1.1保持同步...尽管我想这不是必要的,如果它(上游/1.1)被冻结了的话。 但是,如果它仍在发展(1.1 RC1,1.1 RC2),保持重置以使我的修复处于1.1顶端可能会很麻烦。 - Andy Dennie
@AndyD 不需要。一旦合并基础是1.1(比如今天的快照),你可以在1.1中使用干净的git merge topic123,无论它前进到哪里。没有理由不能只是git pull上游。如果偶然发生冲突,你会想要rebase你的特性分支或者裁定冲突,因为你的修复可能不再适用。 - Christopher
谢谢,Christopher,我很感激你详细的回复。 - Andy Dennie

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