1044

另请参阅:
如何查看哪些 Git 分支正在跟踪哪个远程/上游分支?

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

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

4

24 回答 24

1206

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

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

您必须浏览 SHA 和任何长包装的提交消息,但输入速度很快,而且我在第三列中垂直对齐了跟踪分支。

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


更新

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

于 2012-09-21T21:54:31.247 回答
447

两种选择:

% 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
于 2012-03-17T20:17:11.723 回答
243

我认为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)
于 2011-10-11T22:25:28.213 回答
87

更新:嗯,自从我发布这个已经好几年了!对于我将 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
于 2011-08-31T00:37:39.040 回答
54

本地分支机构及其远程。

git branch -vv 

所有分支机构和跟踪遥控器。

git branch -a -vv

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

git remote show {remote_name}
于 2016-07-16T00:37:53.593 回答
32

git branch -vv | grep 'BRANCH_NAME'

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

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

于 2019-11-15T08:18:00.733 回答
29

这将向您显示您所在的分支:

$ 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
于 2016-11-16T11:26:25.003 回答
24

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

$ git checkout 
Your branch is up-to-date with 'origin/master'.
于 2014-10-23T10:27:46.023 回答
20

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

$ git config remote.$(git config branch.master.remote).url
于 2011-06-21T12:17:29.973 回答
16

还有一种方式

git status -b --porcelain

这会给你

## BRANCH(...REMOTE)
modified and untracked files
于 2015-09-16T16:17:40.587 回答
12

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)。

于 2020-02-19T09:44:07.287 回答
11

另一种简单的方法是使用

cat .git/config在 git 仓库中

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

于 2014-12-10T07:19:42.593 回答
9
git branch -r -vv

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

于 2016-03-07T02:36:16.620 回答
9

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

if git rev-parse @{u} > /dev/null 2>&1
then
  printf "has an upstream\n"
else
  printf "has no upstream\n"
fi
于 2015-08-27T17:26:36.413 回答
6

列出本地和远程分支:

$ git branch -ra

输出:

  feature/feature1
  feature/feature2
  hotfix/hotfix1
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/master
于 2019-04-15T23:30:20.173 回答
5

你可以试试这个:

git remote show origin | grep "branch_name"

branch_name需要替换为您的分支

于 2019-05-03T11:18:03.833 回答
4

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

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

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

于 2018-10-22T13:43:35.133 回答
2

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

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

此命令获取所有名称:

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

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

于 2020-08-25T19:07:37.880 回答
1

我使用这个别名

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上有更多很棒的别名

于 2012-04-04T15:27:20.583 回答
1

以下命令将远程起源当前叉指

git 远程 -v

要添加远程路径,

git 远程添加源路径名

于 2015-07-09T04:30:19.583 回答
1

改进这个答案,我想出了这些.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
于 2018-10-19T16:32:58.477 回答
0

如果你使用 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
    }
于 2016-09-12T18:20:22.987 回答
0
git branch -vv | grep 'hardcode-branch-name'
# "git rev-parse --abbrev-ref head" will get your current branch name
# $(git rev-parse --abbrev-ref head) save it as string
#  find the tracking branch by grep filtering the current branch 
git branch -vv | grep $(git rev-parse --abbrev-ref head)
于 2022-02-08T19:57:27.270 回答
-2

我使用EasyGit(又名“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
于 2008-10-05T14:39:10.503 回答