Git: 在一个经常变动的基础上维护多个主题分支

25

在我的日常git工作流中,我有许多主题分支,如下所示:

              o--o--o (t2)
             /
         o--o (t1)
        /
 o--o--o (master)
        \
         o--o--o (t3)

当我从上游拉取代码时,

              o--o--o (t2)
             /
         o--o (t1)
        /
 o--o--o--n--n--n (master)
        \
         o--o--o (t3)

我想要将所有的主题分支变基(rebase)到新的主分支上:

                        o'--o'--o' (t2)
                       /
                  o'--o' (t1)
                 /
 o--o--o--n--n--n (master)
                 \
                  o'--o'--o' (t3)

目前我通过手动使用git rebase --onto来实现这一点。在这种情况下,整个更新过程如下:

$ git checkout master
$ git pull
$ git rebase master t1
$ git rebase --onto t1 t2~3 t2
$ git rebase master t3

当在各个主题分支之间跳转并添加提交时,情况变得更加复杂。

在我的情况下,主题分支之间的依赖关系纯粹是树形结构:没有分支依赖于超过一个其他分支。(我必须按照特定顺序最终上游依赖的修补程序,因此我事先选择该顺序。)

是否有任何工具可以帮助我管理这个工作流程?我见过TopGit,但似乎它与基于电子邮件的tg patch工作流密切相关,这对我不相关。


你为什么要将t2重新基于master,而不是像图表中展示的那样将其基于t1?同样地,对于t3--onto标志也不适用。 - Lily Ballard
还可以查看问题git rebase branch with all subbranches - knittl
Kevin:哎呀,是的——打错字了 :) - nornagon
参见:https://github.com/goncalopp/git-utilities - 0 _
3个回答

10
相同的问题曾在git邮件列表上提出: 一次性变基多个分支... 链接的回复中有一个带有perl脚本的附件,可以生成所需的命令。
如果你想让这个脚本运行得更快,并避免它妨碍你的操作,请考虑使用git-new-workdir来为自动变基设置一个工作副本。
如果你发现自己一遍又一遍地解决相同的冲突,请考虑启用git rerere
话虽如此,这里还有另一个方案:
# Construct a placeholder commit that has all topics as parent.
HEADS="$(git for-each-ref refs/heads/\*)" &&
MAGIC_COMMIT=$(echo "Magic Octopus"$'\n\n'"$HEADS" |
  git commit-tree \
    $(git merge-base $(echo "$HEADS" | sed 's/ .*//' ))^{tree} \
    $(echo "$HEADS" | sed 's/ .*//;s/^/-p /')) &&
git update-ref refs/hidden/all $MAGIC_COMMIT

# Rebase the whole lot at once.
git rebase --preserve-merges master refs/hidden/all

# Resolve conflicts and all that jazz.

# Update topic refs from the rebased placeholder.
PARENT=
echo "$HEADS" |
while read HASH TYPE REF
do
  let ++PARENT
  git update-ref -m 'Mass rebase' "$REF" refs/hidden/all^$PARENT "$HASH"
done

6
太棒了,谢谢! :D 我使用了这个技巧的稍微修改版本来制作一个脚本,它可以重新定位子树:https://github.com/nornagon/git-rebase-all - nornagon
请注意,自Git 2.18以来,git rebase现在具有--rebase-merges选项,这是--preserve-merges的改进版本,通常应该使用它来代替。 - torek

0

有一种新工具可以自动化这些任务:git-assembler

这是文档中本地分支变基示例的直接链接。

不过,你不应该立即忽略TopGit。生成电子邮件补丁的能力完全是可选的。


-4

很好,但我正在与Chromium工作流集成,它是线性的。这些主题分支仅限本地,很小(通常每个分支只有1-5次提交),并且短暂存在。 - nornagon
哇,这是一篇不错的文章。+1关于变基的明智建议也很好,尽管在特定情况下有理由这样做。 - jupp0r
在我所概述的工作流中,@nornagon,它适用于小型特性。没有区别。通常情况下合并是更好的,因为你会考虑到代码变化以及它们来自哪里,包括移动文件。 - Adam Dymitruk

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