70

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

我的问题是:有没有办法让我将新的更改拉入我的主人,然后一次将我所有的主题分支重新定位到那个?

这是这种情况:

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

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

               D'--E'主题1
              /
    A--B--C--H 主控
              \
               F'--G'话题2

现在,我知道我可以通过将 topic1 和 topic2 重新定位到 master 来实现这一点,我什至可以编写一个脚本来自动执行此操作。但是如果我有几个其他分支,经常创建新分支并删除其他分支,并且我一直收到上游更改怎么办?

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

有没有更简单的方法?

4

5 回答 5

22

我相当确定没有办法自动执行此操作。请记住,“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 diff”替换为“git checkout $branch && git rebase master”(或者如果您设置了“git pull --rebase”)。我认为您必须检查是否存在“.git/rebase-apply”目录或检查未合并文件的索引(“git ls-files -u”)以测试我们是否一直在等待做一个合并。

当然,如果没有冲突,那么这很容易......它会产生一些在不容易的时候也能工作的东西,这就是问题所在:p

这并不一定能解决如果你的一个分支基于其他东西会发生什么......这就是为什么我提到使用“git pull --rebase”,因为这将根据分支配置重新设置,而不是盲目地从主. 虽然检测不是基于分支配置......也许最简单的方法是检查每个分支并执行“git pull”并让分支配置处理所有事情,包括是否变基或合并?

于 2009-05-14T23:19:43.527 回答
13

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

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

由于您想要重新设置的主题分支可能会随着时间的推移而改变,这是一个快速的 dir^H^H^Hflexible 解决方案 :-)

于 2011-12-14T17:18:37.250 回答
1

我已经把它变成了一个健壮的脚本,在我的 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]
于 2016-09-22T12:47:56.070 回答
0
git branch | sed 's/\*/ /g' | xargs -n1 git rebase master
于 2021-02-17T15:10:57.450 回答
0

如果您想将所有本地分支重新定位到 master,您可以尝试以下操作:

git branch | cut -c 3- | for branch in $(cat); do git rebase master $branch; done
于 2021-12-27T23:07:45.990 回答