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]