有什么方法可以获取并检出提供的参数,而不必关心它是分支名称还是提交哈希?
git fetch
git checkout origin/<branch> or origin/<commit>
如何? git checkout origin/<commit>
说没有这样的分支。简单的git checkout <argument>
是不可能的,因为它不会像git checkout origin/<argument>
那样签出远程分支。
答案 0 :(得分:2)
您可以首先将所有个远程分支(自动包括具有所需提交的分支)提取到本地:
git fetch -a
,然后简单地通过哈希值检出提交:
git checkout <commit-hash>
首先需要fetch
,因为否则您的本地设备可能知道或可能不知道遥控器上的提交哈希。如果没有fetch
,那么如果您直接执行checkout
,则会抱怨提交哈希无效。
答案 1 :(得分:1)
您的问题的前提是错误的:
简单的
git checkout <argument>
是不可能的,因为它不会像git checkout origin/<argument>
那样签出远程分支。
重要的是要在这里实现有关Git的一些相互联系的东西:
HEAD
来查找。refs/heads/name
的引用。使用大写字母的相同单词{HEAD
查找该分支名称。如果没有当前的分支名称,Git会将其称为分离的HEAD 。origin/master
)不是分支名称。完整格式的开头是refs/remotes/
,而不是refs/heads/
。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
是否附加到分支?如果是这样,哪个分支? 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