亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可以“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 關注
  • 5245 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號