关于git check out:如何签出远程git分支?

How do I check out a remote Git branch?

有人把一个叫test的分支和git push origin test推到一个共享存储库中。我可以看到埃多克斯的分店。

现在我想看看远程test分支。

我试过了:

  • 不起作用的

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

如何签出远程git分支?


更新

Jakub的回答实际上改善了这一点。对于Git版本≥1.6.6,仅使用一个遥控器,您可以执行以下操作:

1
2
git fetch
git checkout test

正如用户Masukomi在评论中指出的那样,如果你有多个遥控器,git checkout test将不会在现代Git中工作。在这种情况下,使用

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

或者速记

1
git checkout -t <name of remote>/test

旧答案

在开始在本地处理远程分支之前,您需要按照下面的答案中的调用提取它。

要获取分支,只需:

1
git fetch origin

这将为您获取所有远程分支。您可以看到可用于签出的分支:

1
git branch -v -a

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

1
git checkout -b test origin/test


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

1
git checkout test

(请注意,执行神奇的dwim mery并为您创建本地分支"test"不是"origin/test"),上游将是远程跟踪分支"origin/test"。

git branch输出中的* (no branch)表示您处于未命名的分支上,处于所谓的"分离头"状态(头直接指向提交,而不是对某个本地分支的符号引用)。如果对此未命名分支进行了一些提交,则可以始终在当前提交之外创建本地分支:

1
git checkout -b test HEAD


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

1
$ git branch test origin/test

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


接受的答案不适合你?

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

1
$ git checkout -b remote_branch origin/remote_branch

fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout 'origin/remote_branch' which can not be resolved as commit?

解决方案

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

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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,我们将获得远程跟踪的好处。


我试过上面的方法,但没用。试试这个,它可以工作:

1
git fetch origin 'remote_branch':'local_branch_name'

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


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

1
$ git checkout -t remote_name/remote_branch

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

1
2
$ git remote add remote_name location_of_remote
$ git fetch remote_name

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


用途:

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

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


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

你得去1〔16〕分局…

您只需获取并签出到分支,使用下面的一行命令即可:

1
git fetch && git checkout test

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

git fetch


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

1
git clone <either ssh url /http url>

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

1
git checkout -t origin/future_branch (for example)

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

如果要在签出时重写本地分支名称:

1
git checkout -t -b enhancement origin/future_branch

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

文档


你可以试试

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

1
2
git fetch
git checkout -b local_branch_name origin/branch_name


首先,你需要做:

如果你不知道分支机构的名称

1
git fetch origin branch_name

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

1
git checkout -b branch_name origin/branch_name

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


命令

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

等于

1
 git fetch --all

然后

1
 git checkout -b fixes_for_dev origin/development

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


我使用以下命令:

1
git checkout --track origin/other_remote_branch


如果分支机构不在origin远程服务器上,我喜欢执行以下操作:

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

这将检查位于upstream远程的next分公司与名为second/next的本地分公司。这意味着如果您已经有一个名为next的本地分支,那么它不会发生冲突。

1
2
3
4
$ git branch -a
* second/next
  remotes/origin/next
  remotes/upstream/next


git branch -r说对象名无效,因为分支名不在git的本地分支列表中。从源站更新本地分支列表:

1
git remote update

然后再次尝试签出远程分支。

这对我有用。

我相信git fetch拉进了所有偏远的树枝,这不是最初的海报想要的。


git fetch && git checkout your-branch-name


这些答案对我都不起作用。这起作用了:

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


只需使用远程分支的名称运行git checkout。Git将自动创建跟踪远程分支的本地分支:

1
2
git fetch
git checkout test

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

1
git checkout --track origin/test

1
git checkout -b test origin/test

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


我陷入了这样的境地,我看到了error: pathspec 'desired-branch' did not match any file(s) known to git.提出的上述所有建议。我在Git版本1.8.3.1上。

所以这对我很有效:

1
2
git fetch origin desired-branch
git checkout -b desired-branch FETCH_HEAD

后面的解释是,我注意到,当获取远程分支时,它被获取以获取头部:

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


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

例子:

1
$ git remote show origin

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

1
2
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)

例子:

1
2
$ git fetch origin test:test
$ git checkout test


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

git checkout test which does nothing

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

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

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

解析git checkout xxx时,

  • Git起初把xxx看作一个分支名称,但没有任何分支名为test。
  • 然后Git认为xxx是一个路径,幸运的是(或者不幸的是)有一个名为test的文件。因此,git checkout xxx意味着放弃xxx文件中的任何修改。
  • 如果也没有名为xxx的文件,那么git将根据一些规则尝试创建xxx。其中一条规则是,如果存在remotes/origin/xxx,则创建一个名为xxx的分支。

  • 获取新创建的分支

    1
    git fetch

    切换到另一个分支

    1
    git checkout BranchName

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

    1
    2
    3
    4
    5
    #!/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

    这里还有一个单行版本:

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

    从远程获取并签出分支。

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

    例如。:

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


    请按照命令创建空文件夹。输入并使用此命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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'

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

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

    enter image description here

    出于某种原因,我想知道尖符号()是否与此有关,然后我试着用单引号将分支名称括起来,比如'#9773'rathen,而不仅仅是#9773,而且效果很好。

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