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

标签 git

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

相关文章:

linux - 中央操作系统:混帐: "fatal: could not read from the remote repository"

git - 汇编和github

Git-SVN:从集中式 SVN 服务器更新 Git 存储库

Git 还原错误消息?

如果需要多个标准输入,python asyncio 会死锁

git - 如何在 GIT 中 checkout 单个文件

git - 无法在 OS X El Capitan 中启动 Git

Git 无法锁定 ref 'HEAD' : unable to resolve reference HEAD

git - 从几次非后续提交中获取结果更改

git - 如何在 git merge 、修改、推送后修复 pull 请求?