git checkout <分支>或<commit>

时间:2018-12-15 08:16:21

标签: git

有什么方法可以获取并检出提供的参数,而不必关心它是分支名称还是提交哈希?

git fetch
git checkout origin/<branch> or origin/<commit>

如何? git checkout origin/<commit>说没有这样的分支。简单的git checkout <argument>是不可能的,因为它不会像git checkout origin/<argument>那样签出远程分支。

3 个答案:

答案 0 :(得分:2)

您可以首先将所有个远程分支(自动包括具有所需提交的分支)提取到本地:

git fetch -a

,然后简单地通过哈希值检出提交:

git checkout <commit-hash>

首先需要fetch,因为否则您的本地设备可能知道或可能不知道遥控器上的提交哈希。如果没有fetch,那么如果您直接执行checkout,则会抱怨提交哈希无效。

答案 1 :(得分:1)

您的问题的前提是错误的:

  

简单的git checkout <argument>是不可能的,因为它不会像git checkout origin/<argument>那样签出远程分支。

重要的是要在这里实现有关Git的一些相互联系的东西:

  1. 总是存在–嗯,几乎总是 -当前提交,您可以使用单词HEAD来查找。
  2. 并不总是存在一个当前分支,但如果存在,则它是一个分支名称,即,其全名格式为refs/heads/name的引用。使用大写字母的相同单词{HEAD查找该分支名称。如果没有当前的分支名称,Git会将其称为分离的HEAD
  3. 远程跟踪名称(例如origin/master)不是分支名称。完整格式的开头是refs/remotes/,而不是refs/heads/
  4. 如果您告诉git checkout签出提交,但用分支名称以外的其他名称进行标识,则Git将在签出成功的情况下生成第2点中描述的“分离的HEAD ”状态。(您也可以使用git checkout --detach使用分支名称生成相同的状态。)

上面第4点的结果是git checkout origin/name导致HEAD分离,与git checkout hash-ID相同。

这意味着您的脚本只能使用git checkout <argument>,因为如果参数为哈希ID或为{{1}之类的远程跟踪名称,它将执行相同的操作-产生分离的HEAD。 }。

但是请注意,如果我们将此语句更改为:

  

简单的origin/develop是不合适的,因为它不会像git checkout <argument>那样首先基于现有的远程跟踪名称创建然后签出本地分支。

我们得到一个真实的陈述:git checkout <argument minus the leading origin/ part>将使用名称git checkout develop 创建一个名为develop 的新(本地)分支。 (当然,前提是本地origin/develop还不存在)。但是,仅在此处允许develop并让用户提供<argument>作为名称并没有明显的问题:

develop

例如。

旁注

这里第1点和第2点有一个有趣的结果,那就是问目前#! /bin/sh git fetch && git checkout "$@" 的值 实际上是问两个不同的事物之一问题:

  • HEAD是否附加到分支?如果是这样,哪个分支?
  • 当前提交的哈希ID是什么?

HEAD命令仅回答第一个问题; git symbolic-ref HEAD主要回答第二个问题,但是也可以告诉它也回答第一个问题。


在上面的第1点中,几乎存在于某个特定原因。假设您刚刚创建了一个新的完全空的存储库。 此存储库中没有提交,那么当前提交是哪个提交?

这种情况对Git来说是个问题。您正在一个分支,即git rev-parse HEAD,该分支不存在。 Git将其称为孤立分支尚未创建的分支(取决于Git的哪个部分正在执行调用)。 Git处理此问题的方法是将分支的名称存储到master中,而无需在参考数据库中实际创建分支本身。当您进行新的提交时,那个会自己创建分支,现在问题已解决:您在分支上,它标识了刚刚进行的一个新提交,即当前的提交,因此.git/HEAD命名当前提交当前分支。

(Git可以根据需要使用HEAD重新创建这种稍微痛苦的情况,该方法将新分支的名称写入git checkout --orphan中,而无需实际创建新分支。)

答案 2 :(得分:0)

这个整洁的把戏似乎可以满足我的要求:

git show-ref --head --sha | grep -q ^argument

如果参数为提交哈希,则退出代码为0,否则为1。从这里https://stackoverflow.com/a/29707340/3116571