`git branch remotes / origin / foo`是否会创建一个新的分支?

时间:2016-08-31 19:28:44

标签: git

我在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,它是一个本地分支吗?我该如何删除它?

感谢。

4 个答案:

答案 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如何区分本地和远程跟踪分支

事实上,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 diffgit log会显示一件事,而git checkout则会在一些模棱两可的案例中显示另一件事。最好只是完全避免这种情况。