代码之家  ›  专栏  ›  技术社区  ›  Chris Missal

从当前数据库重新设置多个git分支的基础?[重复]

  •  0
  • Chris Missal  · 技术社区  · 15 年前

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

    我的问题是:有没有一种方法可以让我将新的变化引入到我的主程序中,然后将我所有的主题分支重新设置到主程序中?

    情况就是这样:

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

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

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

    现在,我知道我可以通过在master上重新设置topic1和topic2来实现这一点,我甚至可以编写一个脚本来实现自动化。但是,如果我有几个其他分支,创建新的分支,并经常删除其他分支,并且我一直收到上游更改,该怎么办?

    这个操作(多次重定基准)如果手工完成,既累又容易出错。

    有没有更简单的方法?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Huang C.    4 年前

    我很确定没有一种方法可以自动做到这一点。记住,“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”,因为这将根据分支配置而不是盲目地从master重新设置基址。虽然检测不基于分支配置。。。也许检查每个分支并执行“git pull”并让分支配置处理所有事情,包括是重新基址还是合并,是最简单的方法?