如何查看远程Git分支?

Jur*_*ass 6408 git remote-branch git-checkout

有人将一个名为testwith 的分支推git push origin test送到共享存储库.我可以看到分支git branch -r.

现在我正试图检查远程test分支.

我试过了:

  • git checkout test 什么都不做

  • git checkout origin/test* (no branch).这令人困惑.我怎么能在"没有分支"?

如何查看远程Git分支?

hal*_*ski 8812

更新

Jakub的答案实际上改善了这一点.如果Git版本≥1.6.6,只有一个遥控器,你可以这样做:

git fetch
git checkout test
Run Code Online (Sandbox Code Playgroud)

正如用户masukomi在评论中指出的那样,git checkout test如果您有多个遥控器,则无法在现代git中使用.在这种情况下使用

git checkout -b test <name of remote>/test
Run Code Online (Sandbox Code Playgroud)

或速记

git checkout -t <name of remote>/test
Run Code Online (Sandbox Code Playgroud)

老答案

在开始在远程分支上本地工作之前,您需要在下面的答案中调用它.

要获取分支,您只需:

git fetch origin
Run Code Online (Sandbox Code Playgroud)

这将为您获取所有远程分支.您可以看到可用于结帐的分支:

git branch -v -a
Run Code Online (Sandbox Code Playgroud)

有了远程分支机构,您现在需要查看您感兴趣的分支机构,并为您提供本地工作副本:

git checkout -b test origin/test
Run Code Online (Sandbox Code Playgroud)

  • 为了扩展这个:git不允许你在别人的分支上工作.你只能靠自己工作.因此,如果您想要添加到其他人的分支,您需要创建自己的该分支的"副本",这就是上面的命令所做的(好吧,它也会创建您的分支并检查它). (381认同)
  • 如果它是一个新的远程分支,你可能需要在执行此操作之前使用`git fetch`,以便git知道`origin/test` (136认同)
  • 如果你有多个具有相同分支名称*的遥控器,`git checkout test`将不适用于现代git*.它无法知道使用哪一个. (83认同)
  • ...你会用`git fetch origin test`来做这件事 (54认同)
  • 错误:"git checkout:更新路径与切换分支不兼容.您是否打算签出无法解析为提交的`origin/test`?" (20认同)
  • 我得到了同样的错误,我只需要先进行git fetch:[远程分支上的Git checkout不起作用](http://stackoverflow.com/questions/945654/git-checkout-on-a-远程分支不 - 不工作) (7认同)
  • "如果你有多个遥控器,``git checkout test`将不适用于现代git" - 我有一个遥控器,我仍然需要做`git checkout -b test origin/test` ... (6认同)
  • @BerislavLopac和@samethebest的`git checkout test`对我来说不是用于多个遥控器但只有一个名为`test`的分支......但我终于意识到我的问题是我有一个名为`test`的文件夹.所以git只是检查了那个文件夹.因此我仍然需要做`git checkout -b test origin/test` (5认同)
  • 正如Jakub所指出的那样 - 从1.6.6开始,你应该能够使用更短更安全的结账命令.请考虑选择他的答案. (3认同)
  • 在这里,在 2019 年后的未来,这已经变得像“git switch remoteBranch”一样简单。更多[关于 switch 与 checkout](/sf/ask/4008604981/ Between-git-switch-and-git-checkout-branch)。 (3认同)
  • @Xeoncross阅读此答案[如何解决](http://stackoverflow.com/a/12320930/18788) (2认同)
  • 除了说您可以使用fetch命令获取之外,这不会定义"fetch".一个明显的新用户可能会欣赏从哪里到哪里获得什么的一两个字. (2认同)
  • `git fetch origin` 仅获取远程分支的一部分,而不是全部。我不知道它如何选择它选择的分支,也不知道是什么导致它忽略远程分支,但它只从我的远程获取了大约一半的分支。为了获得我需要的,我必须通过名称指定它:“git fetch origin my-branch”。然后它就不让我检查分支。 (2认同)
  • 非常感谢@BradTurek,我已经更新了答案以使用“git switch”而不是“git checkout”。 (2认同)

Jak*_*ski 1222

旁注:使用现代Git(> = 1.6.6),您可以使用

git checkout test
Run Code Online (Sandbox Code Playgroud)

(请注意,'test'而不是'origin/test')执行神奇的DWIM -mery并为您创建本地分支'test',其上游将是远程跟踪分支'origin/test'.


* (no branch)git branch输出意味着你是无名的分支,在所谓的"分离的头"状态(HEAD直接点提交,并不是象征性的参考了一些当地的分支机构).如果您在此未命名分支上进行了一些提交,则始终可以创建当前分支关闭当前提交:

git checkout -b test HEAD
Run Code Online (Sandbox Code Playgroud)

  • 不足为奇,但是这个版本已经在过去几年中发布了 - 知道这个语法可以节省很多时间,因为仍然有很多旧的文档和评论线程浮出水面,这表明这样做的旧方法. (32认同)
  • "现代git" - 记录,(大约)你指的是什么版本?有时我们必须处理运行较旧发行版的系统. (10认同)
  • @aidan如果你得到一个像`error:pathspec'branch_name'这样的响应与git已知的任何文件都不匹配那么你应该先进行git fetch. (10认同)
  • 在这种情况下,"现代git"是[git 1.6.6](https://raw.github.com/git/git/master/Documentation/RelNotes/1.6.6.txt) (5认同)
  • 使用git版本1.8.3.msysgit.0,这对我不起作用 - 与git已知的任何文件都不匹配 - 我做了很多git抓取 (5认同)
  • @Dennis:`git checkout <non-branch>`,例如`git checkout origin/test`导致分离的HEAD /未命名分支,而`git checkout test`或`git checkout -b test origin/test`导致本地branch`test`(远程跟踪分支`origin/test`为_upstream_) (3认同)

ndi*_*dim 546

在这种情况下,您可能想要创建一个test跟踪远程test分支的本地分支:

$ git branch test origin/test
Run Code Online (Sandbox Code Playgroud)

在早期版本中git,您需要一个显式--track选项,但是当您从远程分支分支时,这是默认选项.

  • 这将创建一个本地分支而不切换到它. (12认同)
  • 虽然我变得致命:模糊的对象名称:'origin/dev' - 其中一个分支'dev'在起源上肯定存在 - 但我不小心在我的机器上创建了一个名为"origin/dev"的分支(在我以前的愚蠢尝试中)为了做到这一点,毫无疑问)...哎哟 (2认同)
  • 在上面的“bash git checkout -b test/origin/test”建议中,您希望在其前面加上“bash git fetch上游”以确保本地存储库知道远程分支“测试`就在那里。否则,谢谢,一切都按广告进行。 (2认同)

Cor*_*lou 461

接受的答案不适合你?

虽然第一个和选定的答案在技术上是正确的,但是您可能还没有从远程存储库中检索所有对象和引用.如果是这种情况,您将收到以下错误:

$ git checkout -b remote_branch origin/remote_branch
Run Code Online (Sandbox Code Playgroud)

致命:git checkout:更新路径与切换分支不兼容.
您是否打算签出无法解析为提交的'origin/remote_branch'?

如果收到此消息,则必须首先在运行之前执行git fetch origin其中origin的远程存储库名称git checkout remote_branch.以下是回复的完整示例:

$ git fetch origin
remote: Counting objects: 140, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 69 (delta 36), reused 66 (delta 33)
Unpacking objects: 100% (69/69), done.
From https://github.com/githubuser/repo-name
   e6ef1e0..5029161  develop    -> origin/develop
 * [new branch]      demo       -> origin/demo
   d80f8d7..359eab0  master     -> origin/master

$ git checkout demo
Branch demo set up to track remote branch demo from origin.
Switched to a new branch 'demo'
Run Code Online (Sandbox Code Playgroud)

如您所见,运行git fetch origin检索到的任何远程分支,我们尚未设置为在本地计算机上跟踪.从那里开始,由于我们现在有一个参考远程分支,我们可以简单地运行git checkout remote_branch,我们将获得远程跟踪的好处.

  • 如果你在本地有一个单独的分支,我会添加一个注释:确保你使用'git remote add origin [the_path_to_your_repo/repo_name.git]'将它与远程仓库相关联.然后使用'git fetch origin',其中'origin'表示您与之关联的原始存储库. (2认同)
  • 我认为这是最新的(它保持$ @!变化!).Git 2.5.5我发现实际*看到远程分支的唯一方法是`git ls-remote`,实际使用它的唯一方法是`git checkout -b [branch] --track [remote/branch]` ......那就是*`git pull [remote] [branch]`之后的工作.即,它实际上拉了整个分支,但仍然不会列出它. (2认同)

Sah*_*lra 242

我尝试了上面的解决方案,但它没有用.试试这个,它有效:

git fetch origin 'remote_branch':'local_branch_name'
Run Code Online (Sandbox Code Playgroud)

这将获取远程分支并创建一个具有名称的新本地分支(如果尚不存在)local_branch_name并跟踪其中的远程分支.

  • 当git fetch origin或git remote update都没有创建本地分支时,这对我有用.我不知道为什么. (33认同)
  • 无缝工作,尤其是从具有多个分支的远程克隆单个分支时. (7认同)
  • 这也适用于我,在那里接受的答案和其他高投票没有.我的git版本是2.5.0 (7认同)
  • 当其他一切都没有时,有谁知道为什么这个有效?(我在git 2.13.0) (5认同)
  • 这是完成我所需要的最直接的方法,即使用远程分支(而不是主分支)来创建新分支. (4认同)
  • 我有一个这种形式的分支:“xx/xx”,这就是我的解决方案。 (3认同)

tac*_*ell 107

对于未命名的远程源(文档),这将是DWIM:

$ git checkout -t remote_name/remote_branch
Run Code Online (Sandbox Code Playgroud)

要添加新遥控器,您需要先执行以下操作:

$ git remote add remote_name location_of_remote
$ git fetch remote_name
Run Code Online (Sandbox Code Playgroud)

第一个告诉Git远程存在,第二个获取提交.


mat*_*ter 102

使用:

git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>
Run Code Online (Sandbox Code Playgroud)

在我的良性案例中,其他答案不适用于现代Git.如果远程分支是新的,您可能需要先拉,但我没有检查过这种情况.

  • 现在看,它们确实重叠.只有我的是简洁的,并告诉你该做什么而不是讲故事.我认为它可能更有用,特别是对于现在的git版本.如果您认为这是一个糟糕的答案,您可以进行投票. (14认同)
  • 你是否意识到这是[答案]的摘录(http://stackoverflow.com/a/13770793/2307070) (2认同)

Ali*_*eza 83

好的,答案很简单......你基本上看到了分支,但你还没有本地副本!...

你需要fetch分支......

您可以简单地获取然后结帐到分支,使用下面的一行命令来执行此操作:

git fetch && git checkout test
Run Code Online (Sandbox Code Playgroud)

我还创建了下面的图像,供您分享差异,看看它是如何fetch工作的以及它与以下方面的不同之处pull:

git fetch


Mad*_*amy 55

要克隆Git存储库,请执行以下操作:

git clone <either ssh url /http url>
Run Code Online (Sandbox Code Playgroud)

上面的命令检出所有分支,但只master初始化分支.如果要结帐其他分支,请执行以下操作:

git checkout -t origin/future_branch (for example)
Run Code Online (Sandbox Code Playgroud)

此命令检出远程分支,您的本地分支名称将与远程分支相同.

如果要在结帐时覆盖本地分支名称:

git checkout -t -b enhancement origin/future_branch
Run Code Online (Sandbox Code Playgroud)

现在您的本地分支名称是enhancement,但您的远程分支名称是future_branch.

文档


uma*_*uma 36

你可以试试

git fetch remote
git checkout --track -b local_branch_name origin/branch_name
Run Code Online (Sandbox Code Playgroud)

要么

git fetch
git checkout -b local_branch_name origin/branch_name
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,在较新版本的git中不再需要`--track`,因为它是默认设置的,如[此早期答案](http://stackoverflow.com/a/1783437/456814)中所述. (2认同)

Moh*_*med 32

首先,你需要做:

git fetch #如果你不知道分支名称

git fetch origin branch_name
Run Code Online (Sandbox Code Playgroud)

其次,您可以通过以下方式检查远程分支到您的本地:

git checkout -b branch_name origin/branch_name
Run Code Online (Sandbox Code Playgroud)

-b 将从您选择的远程分支创建指定名称的新分支.


sre*_*mar 28

命令

git fetch --all
git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>
Run Code Online (Sandbox Code Playgroud)

等于

 git fetch --all
Run Code Online (Sandbox Code Playgroud)

然后

 git checkout -b fixes_for_dev origin/development
Run Code Online (Sandbox Code Playgroud)

双方将建立一个latest fixes_for_devdevelopment


pri*_*vex 27

我使用以下命令:

git checkout --track origin/other_remote_branch
Run Code Online (Sandbox Code Playgroud)

  • 如果您解释为什么以这种方式使用它,这个答案会更有用.即为什么有人应该使用'--track'等...... (12认同)

Jav*_* C. 26

有很多替代方案,例如:


Kri*_*ris 24

如果分支在origin遥控器以外的其他地方我喜欢做以下事情:

$ git fetch
$ git checkout -b second/next upstream/next
Run Code Online (Sandbox Code Playgroud)

这将签出next的分支upstream远端中被称为当地的分支机构second/next.这意味着如果您已经有一个名为next的本地分支,它将不会发生冲突.

$ git branch -a
* second/next
  remotes/origin/next
  remotes/upstream/next
Run Code Online (Sandbox Code Playgroud)


bri*_*ang 18

这些答案都不适合我.这工作:

git checkout -b feature/branch remotes/origin/feature/branch


ali*_*isa 17

我遇到error: pathspec 'desired-branch' did not match any file(s) known to git.了上述所有建议.我正在使用git版本1.8.3.1.

所以这对我有用:

git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

背后的解释是我注意到在获取远程分支时,它被取出到FETCH_HEAD:

$ git fetch origin desired-branch
From github.com:MYTEAM/my-repo
    * branch            desired-branch -> FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)


chi*_*lin 17

长话短说

使用git switch而不是git checkout. 更多详细信息请参见此页面

我认为答案已经过时了。Git 拆分了checkouttoswitchrestorenow 的一些功能。

以下是我的总结:

如果您想更新远程分支的某些内容,您应该创建一个本地分支来“跟踪”远程分支。您可以在本地更新任何您想要的内容,最后推送到远程。如果您在克隆存储库后直接检出远程分支,您可能会看到“分离的 HEAD”状态以及来自 Git 的以下消息:

Note: switching to 'origin/asd'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at d3e1083 Update a
Run Code Online (Sandbox Code Playgroud)

那么我们如何创建本地分支来跟踪远程分支呢?

要创建本地分支来跟踪远程分支,您可以使用git checkout <remote branch name>git switch <remote branch name>。如果你有一个文件或文件夹与你的远程分支名称同名,git checkout会输出一些错误消息,但git switch可以正常工作!

例子:

  1. 查看所有分支,我们要创建一个本地分支来跟踪远程分支remotes/origin/asd,并且我们还有文件名asd

    $ git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/asd
      remotes/origin/ereres
      remotes/origin/master
      remotes/origin/zxc
    $ ls
    a  asd
    
    Run Code Online (Sandbox Code Playgroud)
  2. 文件名与远程分支相同,如果我们使用命令git checkout创建本地分支来跟踪远程分支, Git 应该输出一些错误消息

    $ git checkout asd
    fatal: 'asd' could be both a local file and a tracking branch.
    Please use -- (and optionally --no-guess) to disambiguate
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果我们使用它就可以了git switch

    $ git switch ereres
    Branch 'ereres' set up to track remote branch 'ereres' from 'origin'.
    Switched to a new branch 'ereres'
    
    $ git branch -vv
    * ereres 3895036 [origin/ereres] Update a
      master f9e24a9 [origin/master] Merge branch 'master' of
    
    Run Code Online (Sandbox Code Playgroud)


web*_*guy 16

git branch -r说对象名称无效,因为该分支名称不在Git的本地分支列表中.使用以下命令从源更新本地分支列表:

git remote update
Run Code Online (Sandbox Code Playgroud)

然后尝试再次检查您的远程分支.

这对我有用.

我相信git fetch拉在所有远程分支机构,这是不是原来的海报想要什么.

  • 仅供参考,`git remote update`**也将获取所有远程分支**. (2认同)

Ind*_*ore 15

git fetch && git checkout your-branch-name


Eug*_*ash 13

只需git checkout使用远程分支的名称运行即可.Git会自动创建一个跟踪远程分支的本地分支:

git fetch
git checkout test
Run Code Online (Sandbox Code Playgroud)

但是,如果在多个远程中找到该分支名称,则无法使用,因为Git不知道使用哪个.在这种情况下,您可以使用:

git checkout --track origin/test
Run Code Online (Sandbox Code Playgroud)

要么

git checkout -b test origin/test
Run Code Online (Sandbox Code Playgroud)

2.19中,Git学习了checkout.defaultRemote配置,它在解决这种歧义时指定了默认的远程.


小智 13

在我看来,没有人提出最简单的方法(或者也许我太笨了,不认为这是“一种方法”)。但无论如何,试试这个:

git pull origin remoteBranchName
git switch remoteBranchName
Run Code Online (Sandbox Code Playgroud)

这在同样的情况下对我有用(在我上次拉取请求后在远程创建的分支)。


Kes*_*era 12

git checkout -b "Branch_name" [ B 表示创建本地分支]

git 分支 --all

git checkout -b "你的分支名称"

git 分支

git pull origin "你的分支名称"

从 master 分支成功 checkout 到 dev 分支

在此处输入图片说明


Thu*_*han 11

git remote show <origin name>命令将列出所有分支(包括未跟踪的分支).然后,您可以找到需要获取的远程分支名称.

例:

$ git remote show origin
Run Code Online (Sandbox Code Playgroud)

使用以下步骤获取远程分支:

git fetch <origin name> <remote branch name>:<local branch name>
git checkout <local branch name > (local branch name should the name that you given fetching)
Run Code Online (Sandbox Code Playgroud)

例:

$ git fetch origin test:test
$ git checkout test
Run Code Online (Sandbox Code Playgroud)


Val*_*nal 9

由于某种原因,我不能这样做:

git checkout -b branch-name origin/branch-name
Run Code Online (Sandbox Code Playgroud)

它抛出了错误:

致命:“origin/branch-name”不是提交,无法从中创建分支“branch-name”

我必须做:

git checkout -b branch-name commit-sha
Run Code Online (Sandbox Code Playgroud)

  • 也许您没有从原点“git fetch”所有分支?请注意,现在“git switch”优于“git checkout”:/sf/answers/3994634171/ (7认同)

old*_*man 8

其他人和女孩给出了解决方案,但也许我可以告诉你为什么.

git checkout test什么都不做

Does nothing不相等doesn't work,所以我猜你在终端输入'git checkout test'并按回车键,不会出现任何消​​息,也不会出现错误.我对吗?

如果答案是'是',我可以告诉你原因.

原因是工作树中有一个名为"test"的文件(或文件夹).

git checkout xxx解析,

  1. Git xxx最初看起来是一个分支名称,但是没有任何名为test的分支.
  2. 然后Git认为xxx是一条路径,幸运的是(或者不幸的是),有一个名为test的文件.所以git checkout xxx意味着丢弃xxx文件中的任何修改.
  3. 如果没有名为的文件xxx,那么Git将尝试xxx根据某些规则创建.其中一条规则是创建一个名为xxxif remotes/origin/xxxexists 的分支.


Has*_*mal 8

获得新创建的分支机构

git fetch
Run Code Online (Sandbox Code Playgroud)

切换到另一个分支

git checkout BranchName
Run Code Online (Sandbox Code Playgroud)


Pra*_*nav 8

从远程获取并检出分支。

git fetch <remote_name> && git checkout <branch_name> 
Run Code Online (Sandbox Code Playgroud)

例如:

git fetch origin && git checkout feature / XYZ-1234-Add-alerts


Zah*_*dri 8

要获取所有远程分支,请使用:

git fetch --all
Run Code Online (Sandbox Code Playgroud)

然后结帐到分行:

git checkout test
Run Code Online (Sandbox Code Playgroud)


Sat*_*esh 8

只需运行这两个命令,您就可以开始使用了。

git checkout <branch-name>
git pull <remote> <branch-name>
Run Code Online (Sandbox Code Playgroud)


Pra*_*ddy 8

git fetch --all

会将所有远程分支获取到本地

git checkout test

会将你切换到测试分支


M. *_*cik 7

我经常做: git fetch origin && git checkout --track origin/branch_name


Mar*_*eio 7

工作命令

  1. git fetch origin 'remote_branch':'local_branch_name'

  2. git switch 'local_branch_name'

  3. git pull origin 'remote_branch':'local_branch_name'

第一个用于获取分支并从远程分支创建本地分支。

第二个是切换到本地分支。

第三个是将远程的最新更改拉取到本地分支。


Ozz*_*ech 6

您可以使用以下Bash脚本开始跟踪所有远程分支:

#!/bin/bash
git fetch --all
for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`
  do git branch -f --track "$branch" "origin/$branch"
done
Run Code Online (Sandbox Code Playgroud)

这里也是一个单行版本:

git fetch --all; for branch in `git branch -r --format="%(refname:short)" | sed 's/origin\///'`; do git branch --track "$branch" "origin/$branch" ; done ;
Run Code Online (Sandbox Code Playgroud)


Uly*_*ves 6

如果远程分支名称以特殊字符开头,您需要在 checkout 命令中使用单引号将其括起来,否则 git 将不知道您在谈论哪个分支。

例如,我尝试签出一个名为 as 的远程分支,#9773但该命令无法正常工作,如下图所示:

在此处输入图片说明

出于某种原因,我想知道尖符号 (#) 是否与它有关,然后我尝试用单引号将分支名称括起来,例如'#9773'rathen 而不仅仅是#9773,幸运的是它工作正常。

$ git checkout -b '#9773' origin/'#9773'
Run Code Online (Sandbox Code Playgroud)


小智 6

对我们来说,似乎remote.origin.fetch配置出了问题。因此,除了 ,我们看不到任何其他远程分支master,因此git fetch [--all]没有帮助。既没有git checkout mybranchgit checkout -b mybranch --track origin/mybranch没有工作,虽然它肯定是在远程。

之前的配置只允许master获取:

$ git config --list | grep fetch
remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

通过使用*并从源获取新信息来修复它:

$ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

$ git fetch
...
 * [new branch] ...
...
Run Code Online (Sandbox Code Playgroud)

现在我们可以git checkout在本地远程分支了。

不知道这个配置是如何在我们的本地仓库中结束的。


And*_*hoi 6

我用过那个:

git fetch origin
git reset --hard origin/{branchname}
Run Code Online (Sandbox Code Playgroud)


Net*_*ker 5

我在这里尝试了很多答案,但仍然无法签出到远程分支,事实证明,当我第一次克隆存储库时,我添加了--single-branch标志,这可能是我在尝试从远程分支创建新分支时遇到错误的原因远程分支,为了解决这个问题,我们可以更新存储库的配置以从远程存储库获取所有分支:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch
git branch -r
Run Code Online (Sandbox Code Playgroud)

现在我们可以继续

git checkout -b feature/FS origin/feature/FS
Run Code Online (Sandbox Code Playgroud)