Git:如何一次重新绑定很多分支(具有相同的基本提交)?

我在我的项目中有一个主分支,用于从其他人那里获取更改。 从那以后,我通常有几个主题分支,我目前正在工作。

我的问题是:有什么办法让我把新的变化引入我的主人,然后把我所有的话题分支变成同一个人?

这是情况:

D--E topic1 / A--B--C master \ F--G topic2 

我想用一个命令完成这个(H来自上游):

                D' -  E'topic1
               /
     A  -  B  -  C  -  H主人
               \
                F' -  G'topic2

现在,我知道我可以通过将主题1和主题2分配到主人来完成此任务,甚至可以编写一个脚本来自动执行此操作。 但是如果我有其他几个分支,经常创build新的分支并删除其他分支,我会一直收到上游的变更?

这个操作(几个rebase),手工完成,既累人又容易出错。

有一个更简单的方法吗?

谢谢!

我相当肯定,没有办法自动做到这一点。 请记住,“git rebase master”也可以让你回到需要你解决合并冲突的shell,所以如果你想写一个脚本来自动化所有这些,你需要考虑到这一点。

不过,您可以很容易地跟踪哪些分支需要更新。 嗯,对于任何分支,如果分支不是最新的wrt(即刚刚提交)master,那么“git rev-list branch..master”将产生输出。 所以你需要遍历除了主人以外的所有本地头,以产生一个报告(nb“git show-branch”将大致这样做):

 git for-each-ref 'refs/heads/*' | \ while read rev type ref; do branch=$(expr "$ref" : 'refs/heads/\(.*\)' ) revs=$(git rev-list $rev..master) if [ -n "$revs" ]; then echo $branch needs update git diff --summary --shortstat -M -C -C $rev master fi done 

所以,如果你感觉很勇敢,你可以用“git checkout $ branch && git rebase master”replace这个“git diff”(或者如果你已经设置好的话,也许只是“git pull –rebase”)。 我想你必须检查“.git / rebase-apply”目录是否存在,或检查未合并文件的索引(“git ls-files -u”)以testing我们是否已经等待做一个合并。

当然,如果没有冲突,那么很容易…当产生这样的问题并不容易时,产生的东西也起作用:p

这不一定解决如果你的一个分支是基于别的东西会发生什么…这就是为什么我提到使用“git pull –rebase”来代替,因为这将根据分支configuration而不是rebadase,而不是从主。 虽然检测不是基于分支configuration…也许最简单的办法就是检查每个分支,做“git pull”,并让分支configuration处理所有的事情,包括是否需要重新绑定或合并?

你总是可以像这样写一个shell:

 for branch in topic1 topic2 topic3;do git rebase master $branch;done 

由于您希望重新分配的主题分支可能会随着时间的推移而改变,因此这是一个快速而灵活的解决scheme:-)

我把它变成了一个健壮的脚本,保存在我的git-extensions存储库中 :

 $ git-urebaselocalbr --help Rebase all / the last committed N local branches (except for the current branch and master) to the updated upstream head. Usage: git-urebaselocalbr [--continue|--skip|--abort] [--branches "<branch1> ..."] [N] [-i|--interactive] [options]