有人把一个叫test的分支和git push origin test推到一个共享存储库中。我可以看到埃多克斯的分店。
现在我想看看远程test分支。
我试过了:
如何签出远程git分支?
- @但是它不包括重命名新的本地分支的可能性(如果您希望稍后在上游设置并保持命名一致性)
- 我觉得这条线没用。似乎什么都没用,原来的问题似乎已经在许多答案中丢失了。我读过每一个字,尝试过下面的每一件事,不知道该怎么做。
- Git命令开头不直观,将最新版本引入的更改添加到混合物中,您就拥有了这个页面…
- 我觉得我在吃疯狂的药丸。我试着从upstream中签出一个分支,而不仅仅是origin,而且每一个推荐的答案都没有做任何有帮助的事情(双关语)。编辑-不好意思,前两个答案中包含的大量建议都是无用的;第三个(git branch test origin/test是有效的。很高兴前2名拥有20倍的选票…
- 也许您的工作树中有一个名为"test"的文件,有关详细信息,请参阅stackoverflow.com/a/45006389/792416。
- 这就是我在2017年的工作。两个步骤:1)git fetch origin2)git checkout-borigin/
- git checkout --track origin/test
- 我放弃了尝试,我现在使用vscode
- 语法类似于git checkout -b 。
更新
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 checkout -b test origin/test |
- 在此基础上扩展:Git不允许您在其他人的分支上工作。你只能自己工作。因此,如果您想添加到其他人的分支,您需要创建自己的分支"副本",这就是上面的命令所做的(好吧,它创建了您的分支并将其签出)。
- 如果这是一个新的远程分支,那么在这样做之前,您可能需要git fetch,以便Git知道origin/test。
- …你可以和git fetch origin test一起做。
- 错误:"git checkout:更新路径与切换分支不兼容。您是否打算签出无法解决为提交的origin/test?
- @Xeoncross读了这个答案如何修复它
- 我也遇到了同样的错误,我只需要先执行git获取:远程分支上的git签出不起作用。
- 如果这对任何人都有帮助——为了让这对我有用,我必须先运行git pull origin
- 先取:git fetch --all。
- 正如Jakub所指出的,您应该能够使用自1.6.6以来更短更安全的checkout命令。请考虑选择他的答案。
- 这并没有定义"fetch",只是说您可以使用fetch命令进行fetch。一个明显的新用户可能会对从何处到何处得到的信息表示赞赏。
- 为我工作,但在执行git remote update之后,在git checkout -b test origin/test之前
- @adri&nsalgado the-b会创建一个新的分支,就好像您编写了"Git分支测试来源/测试;Git签出测试"一样。
- @乔丹·迪亚·马特森,我没有足够的信心去编辑答案,但我只是尝试了这个较短的版本,它很有效:git fetch;git checkout test。它自动设置正确的远程跟踪分支。
- Git从哪里获取URL信息?我最终会签出当前工作区内的分支吗?
- 如果您有多个具有相同分支名称的远程设备,那么git checkout test将无法在现代Git中工作。它不知道该用哪一个。
- 前面的评论似乎需要更加突出——有人能在答案中加上这个吗?
- 很抱歉告诉你,这行不通。它将创建一个不知道远程分支与之相关的本地分支
- 如果每次我必须再次谷歌搜索这个答案时我只能投反对票…
- 我有多个遥控器,其中分支只存在于一个遥控器中,但它仍然不起作用。所以我更新了答案,使其不那么具体。
- "如果你有多个遥控器,git checkout test在现代git中就不工作了"--我只有一个遥控器,我仍然需要做git checkout -b test origin/test…
- 是的,但是在做了改变之后,那又是什么呢?
- 别忘了把最新的变化拉出来。
- 在检查分支规范时,不包括源代码/在分支规范的前面
- @Berislavlopac和@samethebest the git checkout test既不是为我工作的,也不是为我工作的多个遥控器,而是只有一个名为test的分支…但我最终意识到我的问题是我有一个名为test的文件夹。所以Git只是在查看那个文件夹。因此,我仍然需要做git checkout -b test origin/test
- 嗨@hallski,我想知道git fetch origin的目的是什么?谢谢)
- @它从存储库"origin"(通常是远程存储库,例如在github上)获取最新的更改。
- 这是git的"git checkout-b test origin/test"部分的错误语义,应该是"git checkout-b origin/test",哦,好吧。
- "这将为您获取所有远程分支。"这不是一个真实的语句。
- 为什么这总是不可能记住?我大概已经查过一千次了。
旁注:使用现代Git(>=1.6.6),您只需
(请注意,执行神奇的dwim mery并为您创建本地分支"test"不是"origin/test"),上游将是远程跟踪分支"origin/test"。
git branch输出中的* (no branch)表示您处于未命名的分支上,处于所谓的"分离头"状态(头直接指向提交,而不是对某个本地分支的符号引用)。如果对此未命名分支进行了一些提交,则可以始终在当前提交之外创建本地分支:
1
| git checkout -b test HEAD |
- 不出所料,但是这个版本在过去几年里已经发布了——了解这个语法可以节省很多时间,因为仍然有很多旧的文档和注释线程在周围浮动,它们暗示了使用旧的方法来完成这个任务。
- "现代Git"--记录在案,(大约)你指的是什么版本?有时我们必须在运行旧发行版的系统上工作。
- 在本文中,"现代git"是git 1.6.6
- 这应该是国际海事组织接受的答案。如果有人知道这是在什么版本的Git,请编辑答案。
- @奈特:埃多克斯一号〔1〕更像是我的德威姆。它不仅添加了--track选项,而且当签出不存在的分支时,它注意到存在同名的远程跟踪分支,并自动为您创建本地分支,您可以签出(不能签出远程跟踪分支,因为它由外部远程存储库控制)。高温高压
- 谢谢,在Git 1.8.3.1中工作正常
- 我把一个分支推到了repo上,然后通过github修改了自述文件。然后我想更新我的本地副本。使用git checkout mybranch会导致git建议我使用git pull,因为mybranch已经存在。感谢您带领我走向解决方案!
- 我使用的是Git版本1.7.10.2(AppleGit-33),git checkout test不适合我。不得不回到公认的答案。我可能有什么奇怪的配置干扰。
- 如果感兴趣的遥控器没有命名为origin,请参见下面的tcaswell的答案。
- @Aidan如果你得到一个类似于error: pathspec 'branch_name' did not match any file(s) known to git.的响应,那么你应该先做一个git获取。
- 使用Git版本1.8.3.msysgit.0,但这对我不起作用-与Git已知的任何文件都不匹配-我做了很多Git提取
- @Pandawood也不适合我,使用1.8.3.4(Apple Git-47)
- @pandawood@adri&nsalgado在您的报告中,打开.git/config并检查从远程(例如源站)获取的refspec不仅从特定分支获取。例如,这是不好的:fetch = +refs/heads/master:refs/remotes/origin/master,因为它只取master。它应该看起来像fetch = +refs/heads/*:refs/remotes/origin/*。然后使用git fetch origin。如果成功,您感兴趣的分支应该出现在fetch输出中,并且它也应该作为远程分支出现在EDOCX1的输出中。
- @ JakubNar?你回答的下一部分与未命名分支有何关联?使用git v1.8.3.2,在签出(和跟踪)远程分支之后,我不在一个未命名的分支上。
- @丹尼斯:git checkout ,例如git checkout origin/test导致头/无名分支分离,git checkout test或git checkout -b test origin/test导致局部分支test(上游为远程跟踪分支origin/test)
- 使用git checkout -B origin/branch将在一行中创建并签出所需的远程分支。其中,作为-b选项,只创建分支并将头部置于分离状态。
在这种情况下,您可能希望创建一个本地test分支,它跟踪远程test分支:
1
| $ git branch test origin/test |
在早期版本的git中,您需要一个显式的--track选项,但是当您从远程分支分支分支时,这是默认的。
- 这将在不切换到本地分支的情况下创建本地分支。
- 虽然我得到了致命的:不明确的对象名:"origin/dev"-其中origin上的分支"dev"最明显存在-但我意外地在我的计算机上创建了一个名为"origin/dev"的分支(在我以前愚蠢的尝试中,毫无疑问地获得了正确的结果)。哎哟
- 这给了我一个错误错误:未能将某些引用推送到提示:更新被拒绝,因为推送到的分支提示位于远程提示:对应项的后面。签出此分支并合并远程更改提示:(例如"git pull"),然后再次推送。提示:有关详细信息,请参见"git push--help"中的"关于快进的说明"。
- git branch test为我工作
接受的答案不适合你?
虽然第一个和选定的答案在技术上是正确的,但您可能尚未从远程存储库中检索到所有对象和引用。如果是这种情况,您将收到以下错误:
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,我们将获得远程跟踪的好处。
- 如果您在本地有一个单独的分支,我将添加一个注释:确保您已使用"git remote add origin[您的u repo/repoame.git]将此与远程回购关联。然后使用"git fetch origin",其中"origin"表示与之关联的源存储库。
- git checkout -b newbranch也非常适用于基于当前分支的一步创建和签出新分支。
- 我认为这是最新的(它保持了@美元)!改变!.git 2.5.5我发现唯一能看到远程分支的方法是git ls-remote,唯一能实际使用的方法是git checkout -b [branch] --track [remote/branch],这是在git pull [remote] [branch]工作之后。也就是说,它实际上拉动了整个分支,但仍然没有列出它。
- 当这个答案也不起作用的时候,看看这个。
- 另外,如果您使用git fetch other_remote only_branch,您仍然会得到fatal错误。你必须在没有分行名称的情况下,向git fetch other_remote。奇怪的设计。
我试过上面的方法,但没用。试试这个,它可以工作:
1
| git fetch origin 'remote_branch':'local_branch_name' |
这将获取远程分支,并创建一个名为local_branch_name的新本地分支(如果尚未存在),并跟踪其中的远程分支。
- 当git fetch origin和git remote update都没有创建本地分支时,这对我很有用。我不知道为什么。
- 这取决于Git版本,但这似乎在其最新版本中得以实现。
- 这是实现我所需要的最直接的方法,即使用远程分支(而不是主分支)创建新的分支。
- 无缝工作,尤其是从具有多个分支的远程克隆单个分支时。
- 这对我也很有效,因为接受的答案和其他高投票率的答案都不是。我的Git版本是2.5.0。
- 我有一个表单分支:"xx/xx",这就是我的解决方案。
- 有人知道为什么其他事情都不管用吗?(我在Git 2.13.0上)
- 自2017年起生效,其中Git版本为2.7.4
- 这是我在Mac OS Sierra(Git版本2.4.0)上工作的唯一答案。
- 在这一点上,我不知道这是否是OP要求的,或者其他什么,但是这个命令允许我做的是自动下拉快进提交。例如,在向master发出请求后,您不希望等待IDE重新加载整个解决方案。在pr之后,您可以运行这个命令,然后切换到master并为下一个特性创建一个新的分支。谢谢你!
- 如果这是唯一对您有效的方法,可能需要检查您是否有此问题。对我来说,它阻止了其他事情的发生。
- 这是唯一对我有用的答案。
- 我已经经历了50次了…git fetch --all提取分支,但不创建分支。git checkout -b branchName根据您当前的分行签出一个新的分行。git checkout upstream/newBranch创建了一个分支,字面意思是upstream/newBranch。这是100%正确的答案。
- 这是我用git clone --single-branch标记克隆repo的唯一方法。
对于未命名的远程源站(文档),这将是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。如果远程分支是新的,您可能需要先拉,但我没有检查过这个情况。
- 你知道这是这个答案的摘录吗
- 现在来看,它们确实是重叠的。只有我的简洁明了,告诉你该做什么而不是讲故事。因此,我认为它可能更有用,特别是对于现在的Git版本。如果你认为这是一个错误的答案,你可以投反对票。
- git fetch是安全的选项。在使用pull之前尝试获取。两者都下载远程内容,但当fetch不更改本地状态时,pull将立即更改本地状态。
好吧,答案很简单…你基本上看到了分支,但还没有本地副本!…
你得去1〔16〕分局…
您只需获取并签出到分支,使用下面的一行命令即可:
1
| git fetch && git checkout test |
我还为您创建了下面的图片,让您分享这些差异,看看fetch是如何工作的,以及它与pull的不同之处:
- 如果没有本地分支机构test,则不工作。
- @dmitrizaitsev是的,它会工作的,如果远程分支在那里,并且您执行fetch,那么您将在本地获取分支…git fetch&git checkout测试..所以这是有效的,除非没有远程分支,但问题是这里已经有一个远程分支了…
- 在我看来,test看起来像一个新的分支,所以它不太可能出现在本地。否则,您可以使用单个git pull命令更容易地执行此操作。
- @dmitrizaitsev,是的,这就是为什么我说git fetch,它检查刚刚创建的远程分支,pull可以带来其他不需要的东西,但是fetch使所有分支都可用,如果您已经在本地有repo…
- 没有pull的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。
文档
- git clone-对我来说非常好
- 是的,你是对的。谢谢你的信息,我很快会更新它@warvariuc
- 如果遥控器没有master,这将不起作用。
你可以试试
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 |
- 仅供参考,新版git不再需要--track,因为它是默认设置的,如前面的回答所述。
首先,你需要做:
如果你不知道分支机构的名称
1
| git fetch origin branch_name |
其次,您可以通过以下方式将远程分支签出到本地:
1
| git checkout -b branch_name origin/branch_name |
-b将从选定的远程分支以指定的名称创建新的分支。
- 我不明白-b.如果你能做"git checkout master",为什么你不能做"git checkout origin/test"?
- -B对于源站/主站的新分支
命令
1 2
| git fetch --all
git checkout -b <ur_new_local_branch_name> origin/<Remote_Branch_Name> |
等于
然后
1
| git checkout -b fixes_for_dev origin/development |
两者都将从development创建一个latest fixes_for_dev。
我使用以下命令:
1
| git checkout --track origin/other_remote_branch |
- 如果你解释为什么用这种方法,这个答案会更有用。也就是说,为什么有人应该使用"--track"等等…
如果分支机构不在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的本地分支列表中。从源站更新本地分支列表:
然后再次尝试签出远程分支。
这对我有用。
我相信git fetch拉进了所有偏远的树枝,这不是最初的海报想要的。
- 仅供参考,git remote update还将获取所有远程分支。
git fetch && git checkout your-branch-name
这些答案对我都不起作用。这起作用了:
git checkout -b feature/branch remotes/origin/feature/branch
- 谢谢。我在想,在调用git branch -a命令时,是否必须使用我在git中看到的完整路径(远程/源/功能/分支),但我不确定,所以我只是使用git checkout -b apps/FEATURE/branch origin/apps/FEATURE/branch,它似乎起作用。消息:Branch 'apps/FEATURE/branch' set up to track remote branch 'apps/FEATURE/epicBranch' from 'origin'. Switched to a new branch 'apps/FEATURE/branch'。
- 太好了谢谢你@brianyang
只需使用远程分支的名称运行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 |
- @Hallski回答说2.15.1版本不起作用,但我有reduce.git文件weigth,只克隆1个分支,并用--depth标志过滤历史记录。例如,$ git clone -b release --single-branch --depth 5 https://github.com/user/repo.gitwron't information $ git remote show origin这并没有列出所有具有单分支克隆存储库的远程分支。
其他人和女孩给出了解决方案,但也许我可以告诉你原因。
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的分支。
获取新创建的分支
切换到另一个分支
可以使用以下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的远程分支,但命令没有正常工作,如下图所示:
出于某种原因,我想知道尖符号()是否与此有关,然后我试着用单引号将分支名称括起来,比如'#9773'rathen,而不仅仅是#9773,而且效果很好。
1
| $ git checkout -b '#9773' origin/'#9773' |
- 在许多unix shell中,#字符用于注释,因此在#之后的任何内容都将被忽略。这是一个shell的东西,不是特定于git的东西。在#之前使用反斜杠的引号就足够了。