Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git checkout<;提交哈希>;vs git签出分支_Git_Git Checkout - Fatal编程技术网

git checkout<;提交哈希>;vs git签出分支

git checkout<;提交哈希>;vs git签出分支,git,git-checkout,Git,Git Checkout,我和git在一起玩,弄糊涂了 develop分支机构的负责人位于235a6d8 当我这样做时: git checkout 235a6d8 从任何其他分支或从开发分支分支,这让我处于超然状态。 我不知道为什么在我签出此分支上的最新提交时会发生这种情况 当我这样做时: git checkout develop 我可以正确地切换到开发分支 我不明白git checkout和git checkout branchname之间的区别 它们有什么不同?A,准备在上工作,方法是拆下头部(请参阅),并更新工

我和git在一起玩,弄糊涂了

develop
分支机构的负责人位于
235a6d8

当我这样做时:

git checkout 235a6d8
从任何其他分支或从
开发分支
分支
,这让我处于超然状态。
我不知道为什么在我签出此分支上的最新提交时会发生这种情况

当我这样做时:

git checkout develop
我可以正确地切换到开发分支

我不明白git checkout和git checkout branchname之间的区别 它们有什么不同?

A,准备在
上工作,方法是拆下头部(请参阅),并更新工作树中的索引和文件

git签出
执行切换时:它准备处理
,通过更新工作树中的索引和文件,并通过将头部指向分支来切换到它

这令人困惑

在“”中记录了这种混淆

2012年5月,他还写道:

在CVS和Subversion中,“签出”创建链接到该存储库的源代码的新本地副本。
Git中最接近的命令是“
Git clone

但是,在git中,“
git checkout
”用于完全不同的内容。
事实上,它有两种截然不同的运行模式:

  • 要切换头指向一个新分支或提交,在用法git checkout
    中。如果
    确实是一个本地分支,这将切换到该分支(即,头将指向引用名称),或者如果它以其他方式解析为提交,则将分离头并将其直接指向提交的对象名称
  • 用特定提交或索引中的内容替换工作副本和索引中的一个或多个文件。
    这可以在用法中看到:
    git checkout--(从索引更新)
    git checkout--
    (其中
    通常是提交)
在我的理想世界中,这两种操作模式有不同的动词,它们都不是“
签出”

嗯。。。 这就是为什么Git 2.23(2019年第3季度)将结帐拆分为:

  • 这将更新工作树(可能还有索引)
  • 它可以切换分支,或者在请求时分离一个分支,以便将所有新提交添加到此分支的尖端
除了VonC的答案(以及Git 2.23即将进行的更改)之外,还有几个值得注意的问题

因为
git checkout
做了多种不同的事情,所以它本质上是令人困惑的

  • git checkout的工作之一是基于目标提交填充索引和工作树。它将在必要时随时这样做

  • 另一种方法是更改
    HEAD
    中记录的分支名称,或在指定提交时将
    HEAD
    设置为分离的HEAD。它将在必要时执行此操作(前提是第一部分允许签出操作)

对于
git checkout
,它将根据您给它的分支名称或提交说明符参数执行第二个操作。也就是说,假设我们将某个shell变量
$var
设置为某个非空但合理的字:它可能设置为
master
,或者
master^{commit}
a23456f
origin/development
或类似的内容。在任何情况下,我们现在运行:

git checkout $var
什么名称或散列ID进入
HEAD
?下面是
git checkout
如何决定:

  • 首先,
    git checkout
    尝试解析我们刚才作为分支名称给出的字符串。假设我们给了它
    master
    develope
    。这是一个有效的、现有的分支吗?如果是这样,这是应该进入
    HEAD
    的名称。如果签出成功,我们将切换到该分支分支机构

  • 否则,我们刚才给它的字符串毕竟不是分支名称(即使它以一开头,例如在
    master~1
    中).Git将尝试将其解析为提交散列ID,就像通过
    Git rev parse
    一样。例如,
    a23456f
    确实看起来像一个缩写的散列ID。如果它是一个,则Git的数据库中有一个ID以
    a23456f
    开头的对象-然后Git确保该ID命名一个提交,而不是一些ot她的对象。1如果它是一个提交哈希ID,则该哈希ID应作为分离的头进入
    头。如果签出成功,我们现在将在给定提交时处于分离头模式

  • 如果两种尝试都不起作用,
    git checkout
    接下来会猜测,
    $var
    可能是一个文件名,并尝试解决这个问题。2但我们将忽略这个特殊情况

许多不是分支名称的名称在这里工作正常。例如,
origin/master
极有可能解析为提交哈希ID。如果
v2.1
是有效标记,
v2.1
可以解析为提交哈希ID。在所有这些情况下,
$var
结果不是分支名称,但可以解析为提交散列ID的e-
git checkout
将尝试对该提交散列执行分离头签出

一旦
git checkout
确定您已请求签出某个特定的提交,或者作为分支名称粘贴到附加的头中,或者作为提交哈希ID粘贴到分离的头中,那么git将决定是否允许签出。这可能会变得非常复杂!有关是否以及何时签出的详细说明,请参阅这是允许的,记住
--force$ git branch f9089e 8dca754b1e874719a732bc9ab7b0e14b21b1bc10
$ git rev-parse f9089e
warning: refname 'f9089e' is ambiguous.
8dca754b1e874719a732bc9ab7b0e14b21b1bc10
$ git branch -d f9089e
Deleted branch f9089e (was 8dca754b1e).
$ git rev-parse f9089e
f9089e8491fdf50d941f071552872e7cca0e2e04