我在master分支下,运行显示分支的git branch -ra
remotes/origin/deals
分支未显示在git branch
的输出中。
我猜这是一个远程跟踪分支,对吗?
我想切换到那个分支,但我不小心跑了
$ git branch remotes/origin/deals
$ git branch
* master
remotes/origin/deals
我应该运行git branch -b remotes/origin/deals
是否正确?
我是否创建了一个名称也为remotes/origin/deals
的新分支,现在有两个名称都是remotes/origin/deals
的分支,这是怎么回事?
如果我创建了一个新的分支remotes/origin/deals
,它是一个本地分支吗?我该如何删除它?
感谢。
答案 0 :(得分:1)
当你跑步时
$ git branch remotes/origin/deals
...您创建了一个新文件:
# file describing local branch created by the above command
.git/logs/refs/heads/remotes/origin/deals
......实际上,您应该删除(手动删除,或使用git branch -d remotes/origin/deals
)。
这与指向远程分支头的文件相反:
# file created by fetching from the remote branch
.git/logs/refs/remotes/origin/deals
要签出远程分支,您应该使用:
$ git checkout remotes/origin/deals
...或者,创建并签出跟踪该远程分支的本地分支:
$ git checkout -b deals --track origin/deals
答案 1 :(得分:1)
.controller('TrendingpackagesCtrl', function($scope, Trendingpackages, $ionicLoading) {
var trendingpackages = [];
$ionicLoading.show({
template: 'Loading...'
});
$scope.trendingpackages = Trendingpackages;
Trendingpackages.$loaded().then(function(){
$ionicLoading.hide();
})
})
创建一个名为remotes / origin / deals
git branch remotes/origin/deals
创建一个名为remotes / origin / deals的新分支并指向该分支
git checkout -b remotes/origin/deals
指向一个名为remotes / origin / deals的现有分支
git checkout remotes/origin/deals
安全地删除分支,确保没有未提交的工作
git branch -d remotes/origin/deals
强行删除分支
git branch -D remotes/origin/deals
删除远程分支
答案 2 :(得分:1)
如果要在远程分支上切换,则需要: git checkout branchname。
现在您已经创建了一个具有相同名称的远程分支的分支。 一个简单的解决方案可能是将项目克隆到不同的本地文件夹。在此之后你可以运行: git checkout remotes / origin / deals 。
答案 3 :(得分:1)
到目前为止你得到的答案都是正确的,但并没有指出一个关键的区别。正如您在另一个问题中看到的那样,Git声明有两种“分支”类型,常规(本地)分支和远程跟踪分支。
然而,在引擎盖下,Git实际上将这些和标签统一起来 - 将它们全部集中在引用的一般类别下。所以这提出了一个很好的问题:Git如何确定 B 是一个本地分支而 R 是一个远程跟踪分支?显而易见的答案实际上是错误的答案!
git branch
命令在没有标记或-l
的情况下运行时会显示本地分支:
$ git branch
master
test
或者,当使用-r
运行时,它会显示远程跟踪分支:
$ git branch -r
origin/master
origin/test
您可以对自己说:啊哈,origin
表示“远程跟踪”。但事实并非如此,事实上,当您运行git branch -a
以查看本地和远程跟踪分支时,输出会发生变化:
$ git branch -a
master
test
remotes/origin/master
remotes/origin/test
现在有点神秘了。也许remotes/origin
意味着远程跟踪?嗯,这更接近,但仍然不对。
事实上,git branch
对你说谎,有一个很好的借口:它试图缩短事情。每个引用的完整名称以refs/
开头。如果git branch
没有做到这种缩短,你会看到:
refs/heads/master
refs/heads/test
refs/remotes/origin/master
refs/remotes/origin/test
现在明显的答案是正确答案:本地分支以refs/heads/
开头,远程跟踪分支以refs/remotes/
开头。(为了完整性,我们还要注意标记以refs/tags/
开头。)git branch
命令缩短了这些,并且知道您要查找的是哪种分支,因为您要么是本地分支机构,要么是远程跟踪分支机构
git branch
命令将相同的规则应用于分支创建。如果您使用-l
或根本没有标记,它会创建一个常规(本地)分支:它会将refs/heads/
放在您输入的任何内容之前。如果您使用-r
,它会创建一个远程跟踪分支:它将refs/remotes/
放在前面。然后,像往常一样,当它向你显示时,它会再将它们剥离。
这意味着git branch remotes/origin/deals
创建refs/heads/remotes/origin/deals
:本地分支,而不是远程跟踪分支。在剥离remotes/origin/deals
之后,它会显示为refs/heads/
。除了实际的远程跟踪分支refs/remotes/origin/deals
之外,有时候无法区分它,所以如果你实际上同时拥有这个名字会有些含糊不清。 1 既然你但是,它不是模棱两可的:它只是一个本地分支,具有非常误导性的名称。
“plumbing”命令git for-each-ref
将默认打印每个参考分支,远程跟踪分支,标记,“注释”,“存储”:简而言之,所有内容< / em>在refs/
下 - 全名。如果您处于这种模棱两可的参考情况,您可以使用git for-each-ref
完全转储所有内容。
对于更好(更高级别)的视图,git branch
具有适当的标记和/或设置了各种颜色选项,将拆分名称。如果git branch -l
(或git branch
没有标记)显示分支名称,则它是本地的,即使它以origin/
或remotes/origin/
开头。如果git branch -r
显示分支名称,则它是远程跟踪分支。打开颜色模式后,本地分支默认为plain,但当前分支以绿色打印;和远程跟踪分支以红色打印。添加多个v
标记(例如git branch -avv
),您将获得其他信息,其中“上游”名称以蓝色打印。 (上游通常是远程跟踪分支,因为这些是Git自动创建的分支,但是可以将一个本地分支设置为另一个本地分支的上游。)
1 Git根据Git的内部规则选择一个来解决这个问题。 the gitrevisions
documentation中描述了这些规则,但有一个重要的警告:git checkout
命令使用自己的不同规则。因此,git diff
或git log
会显示一件事,而git checkout
则会在一些模棱两可的案例中显示另一件事。最好只是完全避免这种情况。