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

nor*_*gon 16 git

在我的日常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)

我想变基在新主机上的所有顶级主题我的分支:

                        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
Run Code Online (Sandbox Code Playgroud)

在各种主题分支之间跳转并添加提交时,这会变得更加繁琐.

在我的案例中,主题分支之间的依赖关系纯粹是树状的:没有分支依赖于多个其他分支.(我必须以某种特定的顺序最终上游依赖补丁,所以我先选择那个顺序.)

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

Dav*_*arr 6

在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
Run Code Online (Sandbox Code Playgroud)

  • 太好了,谢谢!:DI使用了这种技术的略微修改版本来制作一个仅重新修改子树的脚本:https://github.com/nornagon/git-rebase-all (3认同)