Git将修补程序合并到多个分支

Chu*_*k M 22 git branching-and-merging merge-conflict-resolution

我一直试图围绕git分支模型.我一直在关注http://nvie.com/posts/a-successful-git-branching-model/以获取一些想法并从Subversion获得一件我真正期待的事情就是在一个地方进行改变将它合并到需要它的所有分支.在Subversion中,我们最终做了很多代码副本.

但是我仍然没有完全理解这一点.这是我所拥有的标准类型的工作流程,它总是会产生冲突.

# create new version branch
git checkout master
git checkout -b v3
vim pom.xml  # change branch version to "3.1-SNAPSHOT"
git commit -a
git checkout master
vim pom.xml  # change master version to "4.0-SNAPSHOT"
git commit -a
Run Code Online (Sandbox Code Playgroud)

因此主设备处于4.0-SNAPSHOT,分支处于3.1-SNAPSHOT.

不是我想在分支上创建一个修补程序并将其移动到主干.

git checkout v3
git checkout -b hotfix
vim file.txt  # make a bugfix change
git commit -a
git checkout v3
git merge hotfix  # this works fine
git checkout master
git merge hotfix  # this has a conflict since both branches have changed the version
Run Code Online (Sandbox Code Playgroud)

我明白为什么会发生这种情况并且有意义.有没有更好的方法呢?

我读到了关于樱桃挑选的内容,我测试过并且确实有效:

git checkout v3
git cherry-pick a518b0b75eaf28868
git checkout master
git cherry-pick a518b0b75eaf28868
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不是处理此问题的"正确"方法.有什么建议?

ell*_*eth 23

如果你想获得超级技术,你可以从一个共同的祖先创建修补程序:

git merge-base v3 master
git checkout -b hotfix <whatever you got from merge-base>
# make your fix
git checkout v3 && git merge --no-ff hotfix
git checkout master && git merge --no-ff hotfix

        v3--------v3 (hotfixed)
       /         /
ancestor----hotfix
       \         \
        master----master (hotfixed)
Run Code Online (Sandbox Code Playgroud)

--no-ff标志是有没有强调Git会创建一个合并提交,保持hotfix分支标签在修补程序尖,而不是拉动标签v3master.(您可以省略该标志并获得相同的行为,因为hotfix分支有一个不在的提交masterv3.文档中的更多信息.)

就个人而言,我认为这太过分了.我会选择gahooa:在有意义的分支上制作修补程序,然后根据你希望分支相互关联的方式合并或挑选.

  • 为'merge-base`,`--no-ff`和所有好建议+1.`cherry-pick`创建新的提交:相同的差异,日志消息,时间戳,但不同的哈希.如果清晰的历史很重要,我认为合并基础根本不是一种矫枉过正.Cherry挑选适用于简单的情况,但要注意这样的事情:http://news.ycombinator.com/item?id = 3947950 (6认同)

gah*_*ooa 11

真的,你的答案取决于你是否希望你的树基于相同的历史......例如,4.0基于最新的3.X + 4.0中的所有变化......

就个人而言,一旦您决定为新版本开始新的分支,我不建议您这样做.在给定的时间点,软件采取不同的方向,所以你的分支机构也应该.

git cherry-pick是您理想的解决方案.在任何分支最有意义的情况下进行更改,然后将其选择到旧版本.这与检出旧分支并手动应用相同更改并进行新提交相同.它保持清洁和重点.

Git merge或rebase将尝试将分支历史集成在一起,每个都以自己的方式,我怀疑你在向后移植错误修复时不想要等等...