【问题标题】:How do I check out a remote Git branch?如何签出远程 Git 分支?
【发布时间】:2010-12-19 11:56:13
【问题描述】:

有人将名为test 和git push origin test 的分支推送到共享存储库。我可以看到带有git branch -r 的分支。

现在我正在尝试检查远程test 分支。

我试过了:

  • git checkout test 什么都不做

  • git checkout origin/test 给出* (no branch)。这令人困惑。我怎么能在“没有分支”?

如何签出远程 Git 分支?

【问题讨论】:

  • 我认为这个线程没有帮助。似乎没有任何效果,原来的问题似乎已经在许多答案中丢失了。我已经阅读了每一个字,尝试了下面的所有内容,但不知道如何做 OP 想要做的事情。
  • 我感觉自己在吃药。我正在尝试从upstream 签出一个分支,而不仅仅是origin,并且每个推荐的答案都没有任何远程帮助(双关语)。 编辑 - 对不起,前 2 个答案中包含的大量建议毫无用处;第三个(git branch test origin/test)是有效的。很高兴前 2 名的票数是 20 倍...
  • 可能对其他人有用:当我使用 Atom 编辑器 UI 来获取和拉取更改时,它会在“主”分支上拉取更改,但没有创建本地引用到第二个远程分支。在命令行上使用git fetch 创建了该引用,然后我能够根据几个答案签出分支。

标签: git git-checkout remote-branch


【解决方案1】:

根据配置的远程存储库是一个还是多个,答案已被拆分。这样做的原因是,对于单个远程情况,一些命令可以简化,因为歧义较少。

为 Git 2.23 更新:对于旧版本,请参阅末尾部分。

一个遥控器

在这两种情况下,首先从远程存储库获取,以确保您已下载所有最新更改。

$ git fetch

这将为您获取所有远程分支。您可以通过以下方式查看可用于结帐的分支:

$ git branch -v -a

...
remotes/origin/test

以remotes/* 开头的分支可以被认为是远程分支的只读副本。要在分支上工作,您需要从它创建一个本地分支。这是使用 Git 命令 switch(自 Git 2.23 起)通过为其指定远程分支的名称(减去远程名称)来完成的:

$ git switch test

在这种情况下,Git 猜测(可以使用 --no-guess 禁用)您正在尝试签出并跟踪具有相同名称的远程分支。

带有多个遥控器

在存在多个远程仓库的情况下,远程仓库需要显式命名。

和以前一样,首先获取最新的远程更改:

$ git fetch origin

这将为您获取所有远程分支。您可以通过以下方式查看可用于结帐的分支:

$ git branch -v -a

有了远程分支,你现在需要用-c签出你感兴趣的分支来创建一个新的本地分支:

$ git switch -c test origin/test

更多关于使用git switch的信息:

$ man git-switch

我还为您创建了下面的图像来分享差异,看看如何获​​取工作,以及拉取的不同之处:

在 Git 2.23 之前

git switch 是在 Git 2.23 中添加的,在此之前git checkout 用于切换分支。

仅使用一个远程存储库签出:

git checkout test

如果配置了多个远程存储库,它会变得更长一些

git checkout -b test <name of remote>/test

【讨论】:

  • 进一步扩展:git 不允许你在别人的分支上工作。你只能自己工作。因此,如果您想添加到其他人的分支,您需要创建自己的该分支的“副本”,这就是上面的命令所做的(好吧,它也会创建您的分支并检查它)。
  • 如果它是一个新的远程分支,你可能需要在这样做之前git fetch,以便 git 知道origin/test
  • ...你可以使用git fetch origin test
  • 错误:“git checkout:更新路径与切换分支不兼容。您是否打算签出无法解析为提交的origin/test?”
  • git checkout test 将无法在现代 git 中工作如果您有多个具有相同分支名称的遥控器。它不知道该使用哪一个。
【解决方案2】:

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

$ git branch test origin/test

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

【讨论】:

  • 这将创建一个本地分支而不切换到它。
【解决方案3】:

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

git checkout test

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


git branch 输出中的 * (no branch) 表示您在未命名的分支上,处于所谓的“分离 HEAD”状态(HEAD 直接指向提交,而不是对某个本地分支的符号引用)。如果你在这个未命名的分支上做了一些提交,你总是可以从当前提交创建本地分支:

git checkout -b test HEAD

** 编辑(由编辑非作者)**

我发现下面的评论似乎使这个答案现代化:

@Dennis:git checkout &lt;non-branch&gt;,例如 git checkout origin/test 导致分离的 HEAD / 未命名分支,而 git checkout test 或 git checkout -b test origin/test 导致本地 分支test(远程跟踪分支origin/test作为上游)- Jakub Narębski 2014 年 1 月 9 日 8:17

强调git checkout origin/test

【讨论】:

  • 不足为奇,但是这个版本是在过去几年里发布的——知道这种语法可以节省很多时间,因为仍然有很多旧的文档和评论线程在建议使用旧的方法这样做。
  • "modern git"——记录一下,(大约)你指的是什么版本?有时我们必须在运行旧发行版的系统上工作。
  • @aidan 如果您收到类似error: pathspec 'branch_name' did not match any file(s) known to git. 的回复,那么您应该先执行 git fetch。
  • 使用 git 版本 1.8.3.msysgit.0 这对我不起作用 - 与 git 已知的任何文件都不匹配 - 我已经完成了许多 git 提取
  • @Dennis: git checkout &lt;non-branch&gt;,例如 git checkout origin/test 导致分离的 HEAD / 未命名分支,而 git checkout test 或 git checkout -b test origin/test 导致本地分支 test(使用远程跟踪分支 @ 987654340@ 作为上游)
【解决方案4】:

这将 DWIM 用于未命名的远程源 (documentation):

$ git checkout -t remote_name/remote_branch

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

$ git remote add remote_name location_of_remote
$ git fetch remote_name

第一个告诉 Git 远程存在,第二个得到提交。

【讨论】:

    【解决方案5】:

    Accepted answer 不适合你?

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

    $ git checkout -b remote_branch origin/remote_branch
    

    致命: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'
    

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

    【讨论】:

      【解决方案6】:

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

      git clone <either ssh url /http url>
      

      上面的命令检查出所有的分支,但只有master 分支会被初始化。如果您想查看其他分支,请执行以下操作:

      git checkout -t origin/future_branch (for example)
      

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

      如果您想在结帐时覆盖您的本地分支名称:

      git checkout -t -b enhancement origin/future_branch
      

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

      【讨论】:

        【解决方案7】:

        如果分支不在origin 远程,我喜欢执行以下操作:

        $ git fetch
        $ git checkout -b second/next upstream/next
        

        这会将upstream 远程上的next 分支检出到名为second/next 的本地分支中。这意味着如果您已经有一个名为 next 的本地分支,它不会发生冲突。

        $ git branch -a
        * second/next
          remotes/origin/next
          remotes/upstream/next
        

        【讨论】:

          【解决方案8】:

          git branch -r 表示对象名称无效,因为该分支名称不在 Git 的本地分支列表中。从原点更新您的本地分支列表:

          git remote update
          

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

          这对我有用。

          我相信git fetch 引入了所有个远程分支,这不是原始发布者想要的。

          【讨论】:

          • 仅供参考,git remote update 还将获取所有远程分支。
          【解决方案9】:

          我尝试了上述解决方案,但没有奏效。试试这个,它有效:

          git fetch origin 'remote_branch':'local_branch_name'
          

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

          【讨论】:

          • 当 git fetch origin 或 git remote update 都没有创建本地分支时,这对我有用。我不知道为什么。
          • 这是完成我需要的最直接的方法,即使用远程分支(不是主分支)来创建新分支。
          • 无缝工作,尤其是在从具有多个分支的远程克隆单个分支时。
          • 这对我也有用,接受的答案和其他高票没有。我的 git 版本是 2.5.0
          • 有谁知道为什么这在其他一切都不起作用的情况下起作用? (我在 git 2.13.0)
          【解决方案10】:

          你可以试试

          git fetch remote
          git checkout --track -b local_branch_name origin/branch_name
          

          或

          git fetch
          git checkout -b local_branch_name origin/branch_name
          

          【讨论】:

          • 仅供参考,在较新版本的 git 中不再需要 --track,因为它是默认设置的,如 this earlier answer 中所述。
          • 这条评论对我有用,谢谢! git checkout -b local_branch_name origin/branch_name
          【解决方案11】:

          git fetch &amp;&amp; git checkout your-branch-name

          【讨论】:

            【解决方案12】:

            请按照命令创建一个空文件夹。输入它并使用这个命令:

            saifurs-Mini:YO-iOS saifurrahman$ git clone your_project_url
            Cloning into 'iPhoneV1'...
            remote: Counting objects: 34230, done.
            remote: Compressing objects: 100% (24028/24028), done.
            remote: Total 34230 (delta 22212), reused 15340 (delta 9324)
            Receiving objects: 100% (34230/34230), 202.53 MiB | 294.00 KiB/s, done.
            Resolving deltas: 100% (22212/22212), done.
            Checking connectivity... done.
            saifurs-Mini:YO-iOS saifurrahman$ cd iPhoneV1/
            saifurs-Mini:iPhoneV1 saifurrahman$ git checkout 1_4_0_content_discovery
            Branch 1_4_0_content_discovery set up to track remote branch 1_4_0_content_discovery from origin.
            Switched to a new branch '1_4_0_content_discovery'
            

            【讨论】:

              【解决方案13】:

              用途:

              git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>
              

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

              【讨论】:

              • 现在看,它们确实重叠。只有我的很简洁,告诉你该做什么,而不是讲故事。因此,我认为它可能会更有用,尤其是对于当今的 git 版本。如果您认为这是一个错误的答案,您可以投反对票。
              【解决方案14】:

              命令

              git fetch --all
              git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name>
              

              等于

               git fetch --all
              

              然后

               git checkout -b fixes_for_dev origin/development
              

              两者都会从development创建一个latest fixes_for_dev

              【讨论】:

                【解决方案15】:

                首先,你需要做:

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

                git fetch origin branch_name
                

                其次,您可以通过以下方式将远程分支签出到本地:

                git checkout -b branch_name origin/branch_name
                

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

                【讨论】:

                  【解决方案16】:

                  其他人给出了解决方案,但也许我可以告诉你原因。

                  git checkout test 什么都不做

                  Does nothing 不等于doesn't work,所以我猜当您在终端中输入“git checkout test”并按回车键时,不会出现任何消​​息,也不会出现错误。我说的对吗?

                  如果答案是“是”,我可以告诉你原因。

                  原因是您的工作树中有一个名为“test”的文件(或文件夹)。

                  当git checkout xxx被解析时,

                  1. Git 最初将 xxx 视为分支名称,但没有任何名为 test 的分支。
                  2. 然后 Git 认为xxx 是一个路径,幸运的是(或不幸地)有一个名为 test.txt 的文件。所以git checkout xxx 意味着丢弃xxx 文件中的任何修改。
                  3. 如果也没有名为xxx 的文件,那么Git 会根据一些规则尝试创建xxx。规则之一是如果存在remotes/origin/xxx,则创建一个名为xxx 的分支。

                  【讨论】:

                    【解决方案17】:

                    您可以使用以下 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
                    

                    这里也是单行版本:

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

                    【讨论】:

                      【解决方案18】:

                      你基本上看到了分支,但是你还没有本地副本!...

                      你需要fetch分支...

                      您可以简单地获取然后结帐到分支,使用下面的一行命令来做到这一点:

                      git fetch && git checkout test
                      

                      我还创建了下面的图片供您分享差异,看看fetch 的工作原理以及它与pull 的不同之处:

                      【讨论】:

                        【解决方案19】:

                        我使用以下命令:

                        git checkout --track origin/other_remote_branch
                        

                        【讨论】:

                        • 如果您解释为什么以这种方式使用它,这个答案会更有用。即为什么有人应该使用'--track'等等......
                        【解决方案20】:

                        git remote show &lt;origin name&gt; 命令将列出所有分支(包括未跟踪的分支)。然后就可以找到需要获取的远程分支名称了。

                        例子:

                        $ git remote show origin
                        

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

                        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)
                        

                        例子:

                        $ git fetch origin test:test
                        $ git checkout test
                        

                        【讨论】:

                        • 天哪,谢谢。十年来一直在使用 git,但在一个巨大的 repo 上突然淹死了,只是想检查一个分支......这让我走了!
                        【解决方案21】:

                        获取新创建的分支

                        git fetch
                        

                        切换到另一个分支

                        git checkout BranchName
                        

                        【讨论】:

                          【解决方案22】:

                          从远程获取并签出分支。

                          git fetch <remote_name> && git checkout <branch_name> 
                          

                          例如:

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

                          【讨论】:

                            【解决方案23】:

                            这些答案都不适合我。这有效:

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

                            【讨论】:

                              【解决方案24】:

                              只需使用远程分支的名称运行git checkout。 Git 将automatically create 一个本地分支跟踪远程分支:

                              git fetch
                              git checkout test
                              

                              但是,如果在多个遥控器中找到该分支名称,这将不起作用,因为 Git 不知道该使用哪个。在这种情况下,您可以使用:

                              git checkout --track origin/test
                              

                              或

                              git checkout -b test origin/test
                              

                              在 2.19 中,Git 学习了 checkout.defaultRemote 配置,该配置指定了解决此类歧义时默认使用的远程。

                              【讨论】:

                                【解决方案25】:

                                对于上述所有建议,我陷入了看到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
                                

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

                                $ git fetch origin desired-branch
                                From github.com:MYTEAM/my-repo
                                    * branch            desired-branch -> FETCH_HEAD
                                

                                【讨论】:

                                  【解决方案26】:

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

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

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

                                  $ git checkout -b '#9773' origin/'#9773'
                                  

                                  【讨论】:

                                    【解决方案27】:

                                    使用fetch 拉出你所有的遥控器

                                       git fetch --all
                                    

                                    列出远程分支:

                                       git branch -r
                                    

                                    列出你所有的分支

                                       git branch -l
                                       >>outpots like-
                                         * develop
                                           test
                                           master
                                    

                                    结帐/更改分支

                                       git checkout master
                                    

                                    【讨论】:

                                    • 试过git branch -l,没有显示远程分支。
                                    • 使用git pull --all 或git fetch --all
                                    • 是的,在那之后,git branch -l 仍然只显示 local 分支。它似乎在没有-l 的情况下与git branch 完全一样,那么-l 的原因是什么?
                                    • 您的回答也没有回答问题 - master 不是远程分支。
                                    【解决方案28】:

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

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

                                    $ git config --list | grep fetch
                                    remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master
                                    

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

                                    $ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
                                    
                                    $ git fetch
                                    ...
                                     * [new branch] ...
                                    ...
                                    

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

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

                                    【讨论】:

                                      【解决方案29】:

                                      要让所有远程分支使用这个:

                                      git fetch --all
                                      

                                      然后结帐到分店:

                                      git checkout test
                                      

                                      【讨论】:

                                        【解决方案30】:

                                        有很多选择,例如:

                                        • 备选方案 1:

                                          git fetch && git checkout test
                                          

                                          这是最简单的方法。

                                        • 备选方案 2:

                                          git fetch
                                          git checkout test
                                          

                                          它是一样的,但有两个陡峭的地方。

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2015-09-26
                                          • 1970-01-01
                                          • 2021-03-07
                                          • 1970-01-01
                                          • 2018-12-22
                                          相关资源
                                          最近更新 更多