Git:在频繁移动的基础上维护许多主题分支

Git:在频繁移动的基础上维护许多主题分支,git,Git,在我的日常git工作流中,我有许多主题分支,如下所示: o--o--o (t2) / o--o (t1) / o--o--o (master) \ o--o--o (t3) 在各种主题分支之间跳转并添加提交时,这会变得更加棘手 在我的例子中,主题分支之间的依赖关系是纯树型的:没有哪个分支依赖于其他单个分支。(我最终必须以某种特定的顺序上游依赖补丁,所以我事先选择了该顺序。) 是否有任何工具可以帮助我管

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

o--o--o (t2) / o--o (t1) / o--o--o (master) \ o--o--o (t3) 在各种主题分支之间跳转并添加提交时,这会变得更加棘手

在我的例子中,主题分支之间的依赖关系是纯树型的:没有哪个分支依赖于其他单个分支。(我最终必须以某种特定的顺序上游依赖补丁,所以我事先选择了该顺序。)


是否有任何工具可以帮助我管理此工作流?我看到了,但它似乎与基于电子邮件的工作流程有很大关系,这与我无关。

不要重新设置基础。从一个共同点开始您的功能。最终合并的工作量要小得多

我们就是这样做的:


在git邮件列表上提出了几乎相同的问题: 链接的响应附带了一个perl脚本,用于生成所需的命令

如果你希望这个脚本快速,避免让它踩在你的脚趾上,也可以考虑使用<代码> Git新的Wordidir <代码>来设置一个自动复制的工作拷贝。< /P>

如果发现自己反复解决同一个冲突,请考虑启用.< /P> 说到这里,这里有一个替代配方:

# 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

有一种新的工具可以使这些任务自动化:

这里有一个直接链接到


不过你不应该马上解雇。生成电子邮件补丁的功能完全是可选的。

为什么要将
t2
重定到
master
上,而不是像图中所示,将其重定到
t1
?类似地,对于
t3
--on
标志也不合适。另请参见问题Kevin:whoops,是的--typo:)另请参见:这很好,但我正在集成Chromium工作流,它是线性的。这些主题分支仅限于本地,很小(通常每个都有1-5次提交)而且很短。哇,这是一篇很好的文章+1关于重定基址的合理建议,尽管在特定情况下有理由这样做。@nornagon在我概述的工作流程中,它适用于小功能。没有区别。合并通常更好,因为您将考虑代码更改以及它们来自何处,包括移动文件。太棒了,谢谢!:D我使用了这项技术的一个稍加修改的版本来制作一个只对子树进行重基的脚本:注意,自从Git 2.18以来,
Git-rebase
现在有了
--rebase-merges
,这是
--preserve-merges
的一个改进版本,通常应该在它的位置使用。 o'--o'--o' (t2) / o'--o' (t1) / o--o--o--n--n--n (master) \ o'--o'--o' (t3)
$ git checkout master
$ git pull
$ git rebase master t1
$ git rebase --onto t1 t2~3 t2
$ git rebase master t3
# 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