我的项目中有一个主分支,用于从其他人那里获取更改。从那时起,我通常有几个主题分支,我正在工作。
我的问题是:有没有办法让我将新的更改添加到我的主人中,然后立即将所有主题分支重新绑定到该主题上?
情况就是这样:
D--E topic1
/
A--B--C master
\
F--G topic2
我想用一个命令(H来自上游)完成这个任务:
D'--E' topic1 / A--B--C--H master \ F'--G' topic2
现在,我知道我可以通过将topic1和topic2重新设置为master来完成此任务,我甚至可以编写一个脚本来自动执行此操作。但是,如果我有其他几个分支,创建新分支并经常删除其他分支并且我一直收到上游变化会怎么样?
这项操作(几次重写),当手工完成时,既累人又容易出错。
有更简单的方法吗?
谢谢!
答案 0 :(得分:18)
我很确定没有办法自动执行此操作。请记住,“git rebase master”也可以让你回到需要你解决合并冲突的shell,所以如果你想编写一个脚本来自动化所有这些,你需要考虑到这一点。
但是,您可以非常轻松地跟踪哪些分支需要更新。嗯,对于任何分支,“git rev-list branch..master”将产生输出,如果分支不是最新的wrt(即刚刚提交在master)之上。所以你需要遍历除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”代替“git diff”(如果你设置的话,或者只是“git pull --rebase”)那个)。我想你必须检查是否存在“.git / rebase-apply”目录或检查未合并文件的索引(“git ls-files -u”)以测试我们是否已经等待合并。
当然,如果没有冲突,那么很容易......它产生的东西也可以在问题不容易的时候起作用:p
这并不一定能解决当你的某个分支基于其他东西时会发生什么......这就是为什么我提到使用“git pull --rebase”而不是因为那会根据分支配置而变化,而不是盲目地从主人那里。虽然检测不是基于分支配置...也许最简单的方法就是检查每个分支并执行“git pull”并让分支配置处理所有内容,包括是否进行rebase或merge?
答案 1 :(得分:8)
你总是可以像这样编写一个单行的shell:
for branch in topic1 topic2 topic3;do git rebase master $branch;done
由于主题分支您希望rebase可能会随着时间的推移而发生变化,这是一个快速而有效的解决方案: - )
答案 2 :(得分:0)
我已将其转换为强大的脚本,并在my git-extensions repository中维护:
$ 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]
答案 3 :(得分:0)
git branch | sed 's/\*/ /g' | xargs -n1 git rebase master