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

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

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

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

843208 次浏览

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

pknotz@s883422: (foo) ~/workspace/bd$ eg infoTotal commits:      175Local repository: .gitNamed remote repositories: (name -> location)origin -> git://sahp7577/home/pknotz/bd.gitCurrent branch: fooCryptographic checksum (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bfDefault pull/push repository: originDefault pull/push options:branch.foo.remote = originbranch.foo.merge = refs/heads/aal_devel_1Number of contributors:        3Number of files:       28Number of directories:       20Biggest file size, in bytes: 32473 (pygooglechart-0.2.0/COPYING)Commits:       62

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

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

更新时间:嗯,我发布这个已经好几年了!为了比较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 branch -av只告诉你你有哪些分支以及它们在哪个提交,让你推断本地分支正在跟踪哪些远程分支。

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

$ git branch -av* abranch                d875bf4 initial commitmaster                 d875bf4 initial commitremotes/origin/HEAD    -> origin/masterremotes/origin/abranch d875bf4 initial commitremotes/origin/master  d875bf4 initial commit

$ git remote show origin* remote originFetch 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):abranchmasterRemote branches:abranch trackedmaster  trackedLocal branches configured for 'git pull':abranch merges with remote abranchmaster  merges with remote masterLocal refs configured for 'git push':abranch pushes to abranch (up to date)master  pushes to master  (up to date)

两个选择:

% 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

我用这个化名

git config --global alias.track '!sh -c "if [ \$# -eq 2 ]thenecho \"Setting tracking for branch \" \$1 \" -> \" \$2;git branch --set-upstream \$1 \$2;elsegit 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

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

$ git branch -vvmain   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 checkout,即“签出当前分支”。这是一个带有副作用的无操作,用于显示当前分支的跟踪信息(如果存在)。

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

另一种简单的方法是使用

cat .git/config在一个git仓库

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

以下命令将远程原点当前分叉所指的

远程删除

对于添加远程路径,

git远程添加源path_name

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

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

另一种方式

git status -b --porcelain

这会给你

## BRANCH(...REMOTE)modified and untracked files
git branch -r -vv

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

当地的分支机构和他们的远程。

git branch -vv

所有分支和跟踪遥控器。

git branch -a -vv

查看本地分支显式配置为推送和拉取的位置。

git remote show {remote_name}

如果您使用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}

这将显示您所在的分支:

$ 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

改进这个答案,我想出了这些.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 insteadOfbranch-url-push  = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #"  # cognizant of pushInsteadOf

如果你想找到任何分支的上游(而不仅仅是你所在的分支),这里对@cDunn2001的答案进行了轻微的修改:

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

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

列出本地和远程分支:

$ git branch -ra

输出:

  feature/feature1feature/feature2hotfix/hotfix1* masterremotes/origin/HEAD -> origin/masterremotes/origin/developremotes/origin/master

你可以试试这个:

git remote show origin | grep "branch_name"

branch_name需要替换为您的分支

git branch -vv | grep 'BRANCH_NAME'

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

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

git状态瓷(机器可读)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失败)。

在尝试了这里的所有解决方案后,我意识到没有一个在所有情况下都是好的:

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

此命令获取所有名称:

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

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

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 branchgit branch -vv | grep $(git rev-parse --abbrev-ref head)

使用grep仅显示当前分支信息没有

git branch -vv --contains

这是缩写为:

git branch -vv --contains HEAD

如果您当前的HEAD的提交ID位于其他分支中,则这些分支也将显示。