为了账号安全,请及时绑定邮箱和手机立即绑定

可以“git pull --all”更新我所有的本地分支机构吗?

可以“git pull --all”更新我所有的本地分支机构吗?

Git
至尊宝的传说 2019-07-31 14:25:20
可以“git pull --all”更新我所有的本地分支机构吗?我经常至少有3个远程分支:master,staging和production。我有3个本地分支跟踪那些远程分支。更新我所有的本地分支机构很繁琐:git fetch --allgit rebase origin/mastergit checkout staginggit rebase origin/staginggit checkout productiongit rebase origin/production我很乐意能够做一个“git pull -all”,但我无法让它发挥作用。它似乎执行“fetch --all”,然后更新(快进或合并)当前工作分支,而不是其他本地分支。我仍然卡在手动切换到每个本地分支和更新。
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

我知道这个问题已经快3年了,但我问自己同样的问题并没有找到任何现成的解决方案。所以,我自己创建了一个自定义git命令shell脚本。

在这里,git-ffwd-update脚本执行以下操作...

  1. 它发出一个git remote update来获取lates revs

  2. 然后用于git remote show获取跟踪远程分支的本地分支列表(例如可以使用的分支git pull

  3. 然后它检查git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>遥控器后面的本地分支提交的数量(反之亦然)

  4. 如果本地分支提前1或更多提交,则不能快速转发,需要手动合并或重新绑定

  5. 如果本地分支提前0提交,后面提交1个或多个提交,则可以快速转发 git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>

该脚本可以像:

$ git ffwd-updateFetching origin
 branch bigcouch was 10 commit(s) behind of origin/bigcouch. resetting local branch to remote
 branch develop was 3 commit(s) behind of origin/develop. resetting local branch to remote
 branch master is 6 commit(s) behind and 1 commit(s) ahead of origin/master. could not be fast-forwarded

完整的脚本应该保存为git-ffwd-update并且需要在PATH

#!/bin/bashmain() {
  REMOTES="$@";
  if [ -z "$REMOTES" ]; then
    REMOTES=$(git remote);
  fi
  REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
  CLB=$(git rev-parse --abbrev-ref HEAD);
  echo "$REMOTES" | while read REMOTE; do
    git remote update $REMOTE
    git remote show $REMOTE -n \    | awk '/merges with remote/{print $5" "$1}' \    | while read RB LB; do
      ARB="refs/remotes/$REMOTE/$RB";
      ALB="refs/heads/$LB";
      NBEHIND=$(( $(git rev-list --count $ALB..$ARB 2>/dev/null) +0));
      NAHEAD=$(( $(git rev-list --count $ARB..$ALB 2>/dev/null) +0));
      if [ "$NBEHIND" -gt 0 ]; then
        if [ "$NAHEAD" -gt 0 ]; then
          echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded";
        elif [ "$LB" = "$CLB" ]; then
          echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge";
          git merge -q $ARB;
        else
          echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. resetting local branch to remote";
          git branch -f $LB -t $ARB >/dev/null;
        fi
      fi
    done
  done}main $@


查看完整回答
1 反对 回复 2019-07-31
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

您描述的行为pull --all完全符合预期,但不一定有用。该选项被传递给git fetch,然后从所有遥控器获取所有引用,而不仅仅是所需的引用; pull然后合并(或在你的情况下,rebase)适当的单个分支。

如果你想查看其他分支机构,你将不得不检查它们。是的,合并(和重新定位)绝对需要一个工作树,所以如果不检查其他分支就无法完成。如果你愿意的话,你可以把你描述的步骤包装成一个脚本/别名,虽然我建议加入这些命令,&&这样如果其中一个失败了,它就不会尝试使用。


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 5171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信