在我日常的 git 工作流程中,我有很多主题分支,如下所示:
o--o--o (t2) / o--o (t1) / o--o--o (master) \ o--o--o (t3)
When I pull from upstream,
o--o--o (t2) / o--o (t1) / o--o--o--n--n--n (master) \ o--o--o (t3)
I want to rebase all my topic branches on top of the new master:
o'--o'--o' (t2) / o'--o' (t1) / o--o--o--n--n--n (master) \ o'--o'--o' (t3)
Currently I do this by hand, using git rebase --onto
. In this scenario, the whole update process would be:
$ git checkout master
$ git pull
$ git rebase master t1
$ git rebase --onto t1 t2~3 t2
$ git rebase master t3
在各个主题分支之间跳转并添加提交时,这会变得更加棘手。
在我的案例中,主题分支之间的依赖关系纯粹是树状的:没有一个分支依赖于多个其他分支。 (我最终必须以某种特定顺序向上游依赖补丁,所以我先验地选择该顺序。)
是否有任何工具可以帮助我管理此工作流程?我看过TopGit ,但它似乎与基于电子邮件的 tg patch
工作流程密切相关,这与我无关。
最佳答案
在 git 邮件列表中提出了几乎相同的问题: Rebasing Multiple branches at once... 链接的响应附有一个 perl 脚本,可生成您需要的命令。
如果您希望这个脚本运行得更快并且避免它踩到您的脚趾,也可以考虑使用 git-new-workdir
来设置一个工作副本,仅用于自动 rebase 。
如果您发现自己一遍又一遍地解决相同的冲突,请考虑启用 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
关于Git:在频繁移动的基础上维护许多主题分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9407234/