ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

m
mtyurt

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

$ 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 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 的答案会更好——如果你正在寻找一个简单的命令并且愿意在视觉上扫描输出,我的答案很好
c
cdunn2001

两种选择:

% 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

好的!如果没有跟踪任何内容,第一个会给出丑陋的错误,而第二个对脚本编写特别有帮助。 BTW %(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”替换为当前分支
A
Ajit George

我认为 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,而它实际上可以是任何东西(例如,多个遥控器,不同的分支跟踪来自不同遥控器的分支)。
A
Aaron Wells

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

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

本地分支机构及其远程。

git branch -vv 

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

git branch -a -vv

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

git remote show {remote_name}

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

git branch -vv | grep 'BRANCH_NAME'

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

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


谢谢,我用它来确定当前分支是否正在跟踪远程分支。万一其他人也在做同样的事情...如果没有跟踪分支,则输出将是 * 'BRANCH_NAME' <commit-sha> 'commit message' 如果有跟踪分支 * 'BRANCH_NAME' <commit-sha> ['TRACKED_BRANCH_NAME']'commit message'
r
rubo77

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

$ 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

E
Eugene Yarmash

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

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

W
William Pursell

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

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

或者如果您只想要 current 分支的被跟踪远程的名称,则为 git config branch.$(git symbolic-ref -q HEAD).remote - URL 为 git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).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
F
FragLegs

还有一种方式

git status -b --porcelain

这会给你

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

A
AndiDog

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


我喜欢这个解决方案,因为它允许在脚本中检测是否为本地分支配置了任何上游分支,而无需了解它们的名称。
r
rayryeng

另一种简单的方法是使用

cat .git/config 在 git 存储库中

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


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

另一种方法(感谢 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 脚本,但没有提供其他信息或上下文。
U
Undo
git branch -r -vv

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


A
Ahmed Ashour

你可以试试这个:

git remote show origin | grep "branch_name"

branch_name 需要替换为您的分支


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

列出本地和远程分支:

$ git branch -ra

输出:

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

J
Jeremy Thomerson

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

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

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


git rev-parse --abbrev-ref --symbolic-full-name HEAD@{upstream} 为我做的 :)
T
Tom Hale

改进了 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 的配置文件用双引号引起来。
E
Erik Aronesty

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

在当地分支机构工作

在分离的树枝上工作

在 CI 下工作

此命令获取所有名称:

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

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


O
Olivier Refalo

我使用这个别名

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 上的更多出色别名


N
Nagaraja G Devadiga

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

git 远程 -v

要添加远程路径,

git 远程添加源路径名


在这里您没有找到远程路径 - 您正在添加
P
Peter Mortensen

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

F
Fred Yang
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)

一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
P
PhillipMcCubbin

使用 grep不显示仅显示当前分支信息:

git branch -vv --contains

这是以下简称:

git branch -vv --contains HEAD

如果您当前 HEAD 的提交 ID 在其他分支中,这些分支也会显示。


N
Nathan Musoke

我使用 EasyGit (a.k.a. "eg") 作为 Git 顶部(或旁边)的超轻量级包装器。 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