Can “git pull --all” update all my local branches?

前端 未结 25 2157
失恋的感觉
失恋的感觉 2020-11-22 16:33

I often have at least 3 remote branches: master, staging and production. I have 3 local branches that track those remote branches.

Updating all my local branches is

25条回答
  •  北海茫月
    2020-11-22 17:20

    I know this question is almost 3 years old, but I asked myself the very same question and did not found any ready made solution. So, I created a custom git command shell script my self.

    Here it goes, the git-ffwd-update script does the following...

    1. it issues a git remote update to fetch the lates revs
    2. then uses git remote show to get a list of local branches that track a remote branch (e.g. branches that can be used with git pull)
    3. then it checks with git rev-list --count .. how many commit the local branch is behind the remote (and ahead vice versa)
    4. if the local branch is 1 or more commits ahead, it can NOT be fast-forwarded and needs to be merged or rebased by hand
    5. if the local branch is 0 commits ahead and 1 or more commits behind, it can be fast-forwarded by git branch -f -t

    the script can be called like:

    $ git ffwd-update
    Fetching 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
    

    The full script, should be saved as git-ffwd-update and needs to be on the PATH.

    #!/bin/bash
    
    main() {
      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 $@
    

提交回复
热议问题