Git:如何一次变换多个分支(使用相同的基本提交)?

时间:2009-05-14 22:36:13

标签: git rebase git-rebase

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

我的问题是:有没有办法让我将新的更改添加到我的主人中,然后立即将所有主题分支重新绑定到该主题上?

情况就是这样:

        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来完成此任务,我甚至可以编写一个脚本来自动执行此操作。但是,如果我有其他几个分支,创建新分支并经常删除其他分支并且我一直收到上游变化会怎么样?

这项操作(几次重写),当手工完成时,既累人又容易出错。

有更简单的方法吗?

谢谢!

4 个答案:

答案 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