如何签出远程 Git 分支?

git git-checkout remote-branch

有人将名为 testgit push origin test 的分支推送到共享存储库。我可以看到带有 git branch -r 的分支。如何签出远程 test 分支?我试过了:

git checkout test,什么都不做

git checkout origin/test 给出 *(无分支)

我认为这个线程是无用的。似乎没有任何效果,原来的问题似乎已经在许多答案中丢失了。我已经阅读了每一个字,尝试了下面的所有内容,并且不知道如何做 OP 想要做的事情。

我觉得我正在服用疯狂的药丸。我正在尝试从 upstream 签出一个分支,而不仅仅是 origin,并且每个推荐的答案都没有任何远程帮助(双关语)。 编辑 - 对不起,前 2 个答案中包含的大量建议毫无用处;第三个(git branch test origin/test)是有效的。很高兴前 2 名的票数是 20 倍……

也许对其他人有用:当我使用 Atom 编辑器 UI 来获取和拉取更改时,它会在“主”分支上拉取更改,但没有创建对第二个远程分支的本地引用。在命令行上使用 git fetch 创建了该引用,然后我能够根据几个答案签出分支。

git fetch 然后 git switch

此答案应存档。向人们展示这么老的答案是没有用的。 Stackoverflow 应该有一个更新的答案按钮。

h
hallski

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

针对 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

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

https://i.stack.imgur.com/zBb51.png

在 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 中工作。它不知道该使用哪一个。

N
Neuron

旁注:使用现代 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 ,例如 git checkout origin/test 结果在分离的 HEAD / 未命名分支中,而 git checkout test 或 git checkout -b test origin/test 结果在本地分支测试(带有远程跟踪分支起源/测试作为上游) – Jakub Narębski 2014 年 1 月 9 日在 8:17

强调git checkout origin/test

不足为奇,但是这个版本是在过去几年发布的——知道这种语法可以节省很多时间,因为仍然有很多旧的文档和评论线程在建议使用旧的方法来执行此操作。

“现代 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 fetches

@Dennis:git checkout <non-branch>,例如 git checkout origin/test 导致分离的 HEAD / 未命名分支,而 git checkout testgit checkout -b test origin/test 导致本地分支 test(远程跟踪分支 origin/test 作为 upstream< /i>)

M
Mattia Righetti

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

$ git branch test origin/test

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

要创建本地分支并切换到它,请使用:

$ git checkout -b test origin/test

这将创建一个本地分支而不切换到它。

在您上面的 bash git checkout -b test/origin/test 建议中,您希望在它前面加上一个 bash git fetch upstream 以确保您的本地存储库知道远程分支 test 在那里。否则,谢谢,一切都像宣传的那样工作。

C
Community

接受的答案对您不起作用?

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

$ 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,我们将获得远程跟踪的好处。

谢谢! git checkout -b branch_name 为我工作。

S
Sahil kalra

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

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 上)

P
Peter Mortensen

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

$ git checkout -t remote_name/remote_branch

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

$ git remote add remote_name location_of_remote
$ git fetch remote_name

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

P
Peter Mortensen

利用:

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

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

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

N
Noel Yap

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

您需要 fetch 分支...

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

git fetch && git checkout test

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

https://i.stack.imgur.com/ODFYa.png

O
Ondrej

要克隆 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

P
Peter Mortensen

你可以试试

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

P
Peter Mortensen

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

尝试检查工作树中子模块中的远程分支时,我遇到了同样的问题。有谁知道这是什么原因?

P
Peter Mortensen

首先,您需要执行以下操作:

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

git fetch origin branch_name

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

git checkout -b branch_name origin/branch_name

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

这对我从来没有用过。我收到一条错误消息,告诉我 不是提交,并且无法从中创建

P
Peter Mortensen

我使用以下命令:

git checkout --track origin/other_remote_branch

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

m
madhead

命令

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

E
Eugene Yarmash

只需使用远程分支的名称运行 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 配置,该配置指定了解决此类歧义时默认使用的远程。

p
prusswan

如果分支位于 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
P
Peter Mortensen

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

git checkout -b feature/branch remotes/origin/feature/branch
I
Inder Kumar Rathore

git fetch && git checkout your-branch-name

P
Peter Mortensen

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

例子:

$ 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 上,只是想检查一个分支......这让我走了!

P
Peter Mortensen

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

git remote update

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

这对我有用。

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

仅供参考,git remote update 还将获取所有远程分支

P
Pranav

从远程获取并签出分支。

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

例如:

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

P
Peter Mortensen

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

git checkout test 什么都不做

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

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

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

解析 git checkout xxx 时,

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

C
Community

获取新创建的分支

git fetch

切换到另一个分支

git checkout BranchName
K
Keshav Gera

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

git 分支--全部

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

git 分支

git pull origin "你的分支名称"

成功从 master 分支结帐到 dev 分支

https://i.stack.imgur.com/0WQfH.png

M
M. Wojcik

我总是这样做:git fetch origin && git checkout --track origin/branch_name

a
ahmednabil88

我用过那个:

git clean -fxd                         # removes untracked (new added plus ignored files)

git fetch
git checkout {branchname}

git reset --hard origin/{branchname}   # removes staged and working directory changes
P
Peter Mortensen

您可以使用以下 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 ;
h
hzpc-joostk

对我们来说,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

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

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

$ git fetch
...
 * [new branch] ...
...

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

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

V
Valentin Vignal

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

$ git checkout -b branch-name origin/branch-name

它抛出错误:

fatal: 'origin/branch-name' is not a commit and a branch 'branch-name' cannot be created from it

我必须做:

$ git checkout -b branch-name commit-sha

也许您没有git fetch所有来自原产地的分支?请注意,现在 git switch 优于 git checkoutstackoverflow.com/a/57066202/6309

git fetch --all; git branch -r --format="%(refname:short)" | sed 's/origin\///' 中的分支;做 git branch --track "$branch" "origin/$branch" ;完毕 ;

Z
Zahra Badri

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

git fetch --all

然后结帐到分支:

git checkout test