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

时间:2008-10-05 05:41:56

标签: git

  

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

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

我是否需要解析git config输出,或者是否有针对我的命令?

24 个答案:

答案 0 :(得分:853)

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

显示上游分支

答案 1 :(得分:329)

两种选择:

% 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

答案 2 :(得分:202)

我认为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)

答案 3 :(得分:62)

更新:好吧,我发布这个已经好几年了!为了我将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

答案 4 :(得分:40)

当地分支机构及其遥控器。

git branch -vv 

所有分支和跟踪遥控器。

git branch -a -vv

查看显式配置本地分支的推拉位置。

git remote show {remote_name}

答案 5 :(得分:19)

这将显示您所在的分支:

$ git branch -vv

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

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

例如:

myremote/mybranch

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

$ 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

答案 6 :(得分:15)

我不知道这是否算作解析git config的输出,但这将决定主人正在跟踪的遥控器的URL:

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

答案 7 :(得分:13)

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

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

答案 8 :(得分:11)

又一种方式

git status -b --porcelain

这会给你

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

答案 9 :(得分:9)

另一种简单的方法是使用

git repo中的

cat .git/config

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

答案 10 :(得分:9)

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

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

答案 11 :(得分:7)

git branch -r -vv

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

答案 12 :(得分:6)

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

答案 13 :(得分:2)

如果要查找 any 分支的上游(而不是您所在的分支),则对@ cdunn2001的答案进行一些修改:

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

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

答案 14 :(得分:2)

git branch -vv | grep 'BRANCH_NAME' | awk '{print $4}'

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

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

awk '{print $4}':仅显示上游分支名称

答案 15 :(得分:1)

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

pknotz@s883422: (foo) ~/workspace/bd
$ eg info
Total commits:      175
Local repository: .git
Named remote repositories: (name -> location)
  origin -> git://sahp7577/home/pknotz/bd.git
Current branch: foo
  Cryptographic checksum (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf
  Default pull/push repository: origin
  Default pull/push options:
    branch.foo.remote = origin
    branch.foo.merge = refs/heads/aal_devel_1
  Number of contributors:        3
  Number of files:       28
  Number of directories:       20
  Biggest file size, in bytes: 32473 (pygooglechart-0.2.0/COPYING)
  Commits:       62

答案 16 :(得分: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

的更多精彩别名

答案 17 :(得分:1)

您可以尝试以下方法:

git remote show origin | grep“分支名称”

branch_name需要替换为ur分支

答案 18 :(得分:1)

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

  • 在当地分支机构工作
  • 在独立分支上工作
  • 在CI下工作

此命令获取所有名称:

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

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

答案 19 :(得分: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
    }

答案 20 :(得分:0)

列出本地和远程分支机构:

$ git branch -ra

输出:

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

答案 21 :(得分:-1)

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

答案 22 :(得分:-3)

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

  

git remote -v

添加远程路径

  

git remote add origin path_name

答案 23 :(得分:-3)

$ git remote --verbose 

(或)

$ git remote --v 

(或)

$ git remote -vv

(或) 详细了解远程分支和主分支

$ git remote show origin

了解具体的远程分支和头分支

$ git remote show origin | grep master
Username for 'https://github.com': Pra.....@9
  HEAD branch: master
    master tracked
    master merges with remote master
    master pushes to master (up to date)