Git:如何一次重新设置多个分支(使用相同的基本提交)的基础?

Git:如何一次重新设置多个分支(使用相同的基本提交)的基础?,git,rebase,git-rebase,Git,Rebase,Git Rebase,我在我的项目中有一个主分支,我使用它来从其他人那里获取更改。从那以后,我通常有几个主题分支,我目前正在研究这些分支 我的问题是:有没有一种方法可以让我将新的更改引入到我的master中,然后立即将所有主题分支重新设置到该主题上 情况就是这样: D--E topic1 / A--B--C master \ F--G topic2 我想用一个命令(H来自上游)来完成这个任务: D'--E'主题1 / A--B--C--H主机 \ F'-

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

我的问题是:有没有一种方法可以让我将新的更改引入到我的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上来实现这一点,我甚至可以编写一个脚本来实现自动化。但是,如果我有几个其他分支,创建新分支并频繁删除其他分支,并且我一直收到上游更改,那该怎么办

手动完成此操作(多次重定基准)既累又容易出错

有没有更简单的方法


谢谢

我相当肯定,没有一种方法可以自动做到这一点。请记住,“git rebase master”还可以将您放回需要您解决合并冲突的shell,因此如果您想编写一个脚本来自动化所有这些,您需要考虑到这一点

不过,您可以相当轻松地跟踪哪些分支需要更新。嗯,对于任何分支,“git rev list branch..master”都会在分支不是最新wrt(即仅在master之上提交)时生成输出。因此,您需要遍历除master之外的所有本地头以生成报告(nb“git show branch”将大致完成此操作):

所以,如果你觉得很勇敢,你可以用“git checkout$branch&&git-rebase-master”之类的东西来代替“git-diff”(如果你已经设置好了,也可以用“git-pull-rebase”来代替)。我认为接下来您必须检查是否存在“.git/rebase apply”目录,或者检查未合并文件的索引(“git ls files-u”),以测试我们是否等待进行合并

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


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

您可以编写一个shell-one-liner,如下所示:

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

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

我已将其转换为一个健壮的脚本,在以下位置进行维护:

$git urebaselocalbr——帮助
重新设置所有/最后提交的N个本地分支的基础(当前分支除外
和主)到更新的上游水头。
用法:git-urebaselocalbr[--continue |--skip |--abort][--分支“…”[N][i |--interactive][options]

谢谢您的帮助!我想这只是一个比我想象的更难的问题,所以我会继续手动重定基址。:)我使用
git branch--no merged
列出了我想向最新的主节点显示的分支。@rjmunro nice,我不知道这个标志。然而,我认为这不适合于分支需要重定基址而不是合并的情况。可能是重复的,但我不确定它是否真的会作为一个没有真实答案的老问题的重复关闭。另请参见。
git-rebase--on
,如果
topic1
topic2
让子分支查看相关问题以获得“更智能”的版本,自动确定包含特定基本提交的分支。虽然此代码可能提供了问题的解决方案,但最好添加上下文以了解其工作原理。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。在解释代码时,用户也可能会给予积极的反馈/支持。
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
for branch in topic1 topic2 topic3;do git rebase master $branch;done
$ 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]
git branch | sed 's/\*/ /g' | xargs -n1 git rebase master