【问题标题】:Find out which remote branch a local branch is tracking找出本地分支正在跟踪哪个远程分支
【发布时间】:2010-09-15 08:28:33
【问题描述】:

另请参阅:
How can I see which Git branches are tracking which remote / upstream branch?

如何找出本地分支正在跟踪哪个远程分支?

我是否需要解析 git config 输出,或者是否有可以为我执行此操作的命令?

【问题讨论】:

  • 嘘。这不是完全重复的。这是另一个的子集,但还有其他方法可以解决问题,例如git remote show origin。另一个问题的主要答案是围绕此处简单答案的 bash 脚本,这可能对某些人有用。希望这个问题不会完全结束。
  • 同意,这绝对不是骗局。它提出的问题与链接的问题完全不同

标签: git branch git-remote


【解决方案1】:

我使用 EasyGit (a.k.a. "eg") 作为 Git 顶部(或旁边)的超轻量级包装器。 EasyGit 有一个“info”子命令,可以为你提供各种超级有用的信息,包括当前分支远程跟踪分支。这是一个示例(当前分支名称为“foo”):

pknotz@s883422: (foo) ~/workspace/bd $ 例如信息 总提交:175 本地存储库:.git 命名远程存储库:(名称 -> 位置) 起源-> git://sahp7577/home/pknotz/bd.git 当前分支: foo 加密校验和 (sha1sum):bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf 默认拉/推存储库:原点 默认拉/推选项: branch.foo.remote = 原点 branch.foo.merge = refs/heads/aal_devel_1 贡献者人数:3 文件数:28 目录数量:20 最大文件大小,以字节为单位:32473 (pygooglechart-0.2.0/COPYING) 提交:62

【讨论】:

    【解决方案2】:

    我不知道这算不算解析 git config 的输出,但这会确定 master 正在跟踪的远程的 URL:

    $ git config remote.$(git config branch.master.remote).url

    【讨论】:

    • 或者git config branch.$(git symbolic-ref -q HEAD).remote,如果你只想要当前分支的远程被跟踪的名字——git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url作为URL。
    • 我需要添加--short 选项才能正常工作。因此,获取当前分支的远程名称:git config branch.$(git symbolic-ref -q --short HEAD).remote 和获取当前分支远程的 URL:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
    【解决方案3】:

    更新:好吧,我发布这个已经好几年了!对于我将 HEAD 与上游进行比较的特定目的,我现在使用 @{u},它是指上游跟踪分支的 HEAD 的快捷方式。 (见https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuem)。

    原始答案:我也遇到过这个问题。我经常在一个存储库中使用多个遥控器,很容易忘记您当前的分支正在跟踪哪一个。有时知道这一点很方便,例如当您想通过 git log remotename/branchname..HEAD 查看本地提交时。

    所有这些东西都存储在 git config 变量中,但您不必解析 git config 输出。如果您调用 git config 后跟一个变量的名称,它只会打印该变量的值,不需要解析。考虑到这一点,这里有一些命令可以获取有关您当前分支的跟踪设置的信息:

    LOCAL_BRANCH=`git name-rev --name-only HEAD`
    TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
    TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
    REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`
    

    就我而言,因为我只想找出我当前遥控器的名称,所以我这样做:

    git config branch.`git name-rev --name-only HEAD`.remote
    

    【讨论】:

    • 这对于创建一个别名来重新定位我当前的分支非常有用。谢谢!
    • 同样适用于我们的“快进”别名,只要操作是快进,它就会将本地跟踪分支推进到远程。
    • 其实我发现这个git name-rev --name-only HEAD 不会告诉你你实际上在哪个分支上。为此,我只使用了git branch | grep '^\*' | cut -d' ' -f2
    • 谢谢!类似问题的其他答案没有提到@{u}别名/快捷方式,这正是我要找的!如果只想确定是否需要拉取,没有理由与 master 分支进行比较。
    • @{u} 是炸弹。并且自 1.7.0 以来一直存在,这意味着如果它在 2018 年有人使用的 git 中不可用,他们可能需要升级。
    【解决方案4】:

    我认为git branch -av 只会告诉您您拥有哪些分支以及它们所在的提交,让您推断本地分支正在跟踪哪些远程分支。

    git remote show origin 明确告诉您哪些分支正在跟踪哪些远程分支。以下是来自具有单个提交和名为abranch 的远程分支的存储库的示例输出:

    $ git branch -av
    * abranch                d875bf4 initial commit
      master                 d875bf4 initial commit
      remotes/origin/HEAD    -> origin/master
      remotes/origin/abranch d875bf4 initial commit
      remotes/origin/master  d875bf4 initial commit
    

    $ git remote show origin
    * remote origin
      Fetch URL: /home/ageorge/tmp/d/../exrepo/
      Push  URL: /home/ageorge/tmp/d/../exrepo/
      HEAD branch (remote HEAD is ambiguous, may be one of the following):
        abranch
        master
      Remote branches:
        abranch tracked
        master  tracked
      Local branches configured for 'git pull':
        abranch merges with remote abranch
        master  merges with remote master
      Local refs configured for 'git push':
        abranch pushes to abranch (up to date)
        master  pushes to master  (up to date)
    

    【讨论】:

    • 我需要一个发现上游分支的命令,所以使用'origin'作为输入是在做一个假设,所以这对我不起作用
    • 但这确实回答了 OP。命令git remote show origin 向您显示本地分支以及它们为推送和拉取跟踪的内容。
    • @dudewad 我认为关键是这个命令假设远程被称为origin,而它实际上可以是任何东西(例如多个远程,不同的分支跟踪来自不同远程的分支)。
    【解决方案5】:

    两个选择:

    % git rev-parse --abbrev-ref --symbolic-full-name @{u}
    origin/mainline
    

    % git for-each-ref --format='%(upstream:short)' "$(git symbolic-ref -q HEAD)"
    origin/mainline
    

    【讨论】:

    • 不错!如果没有跟踪任何内容,第一个会给出丑陋的错误,而第二个对脚本编写特别有帮助。顺便说一句,%(refname:short)--format 中当前引用的名称。
    • git help revisions(文档中鲜为人知但最有用的部分之一)并搜索upstream
    • 这个答案比上面的两个答案要好得多,特别是如果你想做类似git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
    • 这个真的很有用echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
    • 如果你想找出其他分支的上游,第二种选择的变体是:git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH) 用分支名称替换 SOMEBRANCH,或当前分支的“HEAD”
    【解决方案6】:

    我使用这个别名

    git config --global alias.track '!sh -c "
    if [ \$# -eq 2 ]
     then
       echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
       git branch --set-upstream \$1 \$2;
     else
       git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
    fi  
    " -'
    

    然后

    git track
    

    请注意,该脚本也可用于设置跟踪。

    https://github.com/orefalo/bash-profiles 的更多好别名

    【讨论】:

      【解决方案7】:

      Here 是一个为您提供所有跟踪分支的命令(配置为“拉”),请参阅:

      $ git branch -vv
        main   aaf02f0 [main/master: ahead 25] Some other commit
      * master add0a03 [jdsumsion/master] Some commit
      

      您必须仔细阅读 SHA 和任何长包装的提交消息,但键入起来很快,而且我在第 3 列中垂直对齐了跟踪分支。

      如果您需要有关每个分支的“拉”和“推”配置的信息,请参阅git remote show origin 上的其他答案。


      更新

      从 git 版本 1.8.5 开始,您可以使用 git statusgit status -sb 显示上游分支

      【讨论】:

      • 这个输出比git branch -avgit remote show origin 更直接,它们会为您提供大量数据,而不仅仅是跟踪的遥控器
      • 顺便说一句,最新版本的 git (1.8.5.x) 现在也在 git statusgit status -sb 期间显示上游分支——所以一旦你升级到 1.8.5.x,这问题(和答案)无关紧要。
      • 虽然这会给你你想要的信息,但我不同意,因为它是正确的答案。这是一个答案,就像给某人一本字典答案“你如何拼写 XYZ”一样。例如,您想将结果答案(分支名称)用于某些操作。这个答案只能帮助我直观地看到它...不会为您提供在后续命令中可用的东西。
      • 此命令的输出可能会产生误导,因为提交消息可能很容易以例如“[my-feature] ...”开头。请参阅@cdunn2001 的答案,该答案仅显示上游分支(如果有)而没有其他内容。
      • 我同意@jonas-berlin——如果你想解析结果,cdunn2001 的答案会更好——如果你正在寻找一个简单的命令并且愿意在视觉上扫描输出,我的答案很好
      【解决方案8】:

      您可以使用git checkout,即“检查当前分支”。这是一个无操作,具有显示当前分支的跟踪信息(如果存在)的副作用。

      $ git checkout 
      Your branch is up-to-date with 'origin/master'.
      

      【讨论】:

        【解决方案9】:

        另一个简单的方法是使用

        cat .git/config 在 git 仓库中

        这将列出本地分支机构的详细信息

        【讨论】:

        • 在 Linux 上运行良好。除非在类似 Unix 的提示符下(例如 cygwin 或 git bash),否则无法在 Windows 上工作。
        • 在 Windows 中只需使用 type .git/config 而不是 cat .git/config 当然在普通命令行上..
        【解决方案10】:

        以下命令将远程起源当前fork所指的

        git 远程 -v

        对于添加远程路径,

        git 远程添加源路径名

        【讨论】:

        • 这里您没有找到远程路径 - 您正在添加
        【解决方案11】:

        另一种方法(感谢osse),如果你只是想知道它是否存在:

        if git rev-parse @{u} > /dev/null 2>&1
        then
          printf "has an upstream\n"
        else
          printf "has no upstream\n"
        fi
        

        【讨论】:

        • 什么语言?这看起来像一个 Linux shell 脚本,但没有提供其他信息或上下文。
        【解决方案12】:

        另一种方式

        git status -b --porcelain
        

        这会给你

        ## BRANCH(...REMOTE)
        modified and untracked files
        

        【讨论】:

          【解决方案13】:
          git branch -r -vv
          

          将列出所有分支,包括远程。

          【讨论】:

            【解决方案14】:

            本地分支机构及其远程。

            git branch -vv 
            

            所有分支和跟踪遥控器。

            git branch -a -vv
            

            查看本地分支在何处显式配置为推送和拉取。

            git remote show {remote_name}
            

            【讨论】:

            • 这是正确答案。例如git remote show origin 实际上确实显示了我的遥控器的网址。
            • @kingaj 这要求您知道遥控器的名称(来源)。您是否 100% 确定当您输入 git push 时,您正在推送到 origin?这不是我的情况,我实际上在这里寻找简单的答案因为我的许多别名/快捷方式硬编码origin 但有时我使用多个遥控器,所以这些对我来说都坏了
            • @nhed post below 答案中的模式可能会有所帮助。我刚试了一下,效果很好。
            • @the-typist 是的,我实际上已经在同一天对这个答案投了赞成票。它很干净,但如果git 可以回答它而不必进行多次调用,那就太好了。我去重写了几个用于硬编码origin 的别名/函数
            【解决方案15】:

            如果您使用的是 Gradle,

            def gitHash = new ByteArrayOutputStream()
                project.exec {
                    commandLine 'git', 'rev-parse', '--short', 'HEAD'
                    standardOutput = gitHash
                }
            
            def gitBranch = new ByteArrayOutputStream()
                project.exec {
                    def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d'  -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
                    commandLine "bash", "-c", "${gitCmd}"
                    standardOutput = gitBranch
                }
            

            【讨论】:

              【解决方案16】:

              这将显示您所在的分支:

              $ git branch -vv
              

              这将仅显示您当前所在的分支:

              $ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
              

              例如:

              myremote/mybranch
              

              您可以找到您所在的当前分支使用的远程的URL:

              $ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)
              

              例如:

              https://github.com/someone/somerepo.git
              

              【讨论】:

                【解决方案17】:

                改进了this answer,我想出了这些.gitconfig 别名:

                branch-name = "symbolic-ref --short HEAD"
                branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
                branch-remote-push  = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
                branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url        \"$remote\" #"  # cognizant of insteadOf
                branch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf
                

                【讨论】:

                • 那是什么语言?
                • @Dan Farrell:外壳。以 ! 开头的别名使用 /bin/sh。 git 的配置文件用双引号引起来。
                【解决方案18】:

                如果您想找到 any 分支的上游(而不仅仅是您所在的分支),这里对@cdunn2001 的回答稍作修改:

                git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}

                这将为您提供名为 YOUR_LOCAL_BRANCH_NAME 的本地分支的远程分支名称。

                【讨论】:

                  【解决方案19】:

                  列出本地和远程分支:

                  $ git branch -ra
                  

                  输出:

                    feature/feature1
                    feature/feature2
                    hotfix/hotfix1
                  * master
                    remotes/origin/HEAD -> origin/master
                    remotes/origin/develop
                    remotes/origin/master
                  

                  【讨论】:

                    【解决方案20】:

                    你可以试试这个:

                    git remote show origin | grep "branch_name"
                    

                    branch_name 需要替换为你的分支

                    【讨论】:

                    • 如果您的分支名称也与其他分支匹配怎么办?您的分支名称与git remote show origin 输出中的其他文本匹配会发生什么情况 - 如果它被称为mergesconfigure
                    • 没有得到你。您的意思是多个具有相同名称的分支
                    • “匹配其他分支”的示例:当前分支是“foo”,但也有 grep 将匹配的“foobar”;当前分支是“v3.4”,但正则表达式中的. 表示任何字符,因此也将匹配“v314”...
                    【解决方案21】:

                    git branch -vv | grep 'BRANCH_NAME'

                    git branch -vv:这部分将显示所有本地分支及其上游分支。

                    grep 'BRANCH_NAME' :它将从分支列表中过滤当前分支。

                    【讨论】:

                      【解决方案22】:

                      git-status瓷器(机器可读)v2输出如下:

                      $ git status -b --porcelain=v2
                      # branch.oid d0de00da833720abb1cefe7356493d773140b460
                      # branch.head the-branch-name
                      # branch.upstream gitlab/the-branch-name
                      # branch.ab +2 -2
                      

                      并且只获取上游分支:

                      $ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
                      gitlab/the-branch-name
                      

                      如果分支没有上游,上面的命令将产生一个空输出(或失败,set -o pipefail)。

                      【讨论】:

                        【解决方案23】:

                        在这里尝试了所有解决方案后,我意识到它们在所有情况下都不是很好:

                        • 在当地分支机构工作
                        • 在分离的分支上工作
                        • 在 CI 下工作

                        此命令获取所有名称:

                        git branch -a --contains HEAD --list --format='%(refname:short)'
                        

                        对于我的应用程序,我必须过滤掉 HEAD 和 master refs,更喜欢远程 refs,并去掉“origin/”这个词。然后如果没有找到,请使用第一个没有 /( 的非 HEAD 引用。

                        【讨论】:

                          猜你喜欢
                          • 2012-09-18
                          • 2013-04-30
                          • 2011-07-27
                          • 2012-10-14
                          • 2021-03-21
                          • 1970-01-01
                          • 2016-01-16
                          • 2016-09-12
                          • 2010-09-27
                          相关资源
                          最近更新 更多