Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.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重置“;及;git checkout";?_Git_Git Checkout_Git Reset - Fatal编程技术网

什么';这两者之间的区别是什么;git重置“;及;git checkout";?

什么';这两者之间的区别是什么;git重置“;及;git checkout";?,git,git-checkout,git-reset,Git,Git Checkout,Git Reset,我一直认为git reset和git checkout是一样的,因为这两种方法都会使项目回到特定的提交状态。然而,我觉得它们不可能完全相同,因为这是多余的。两者之间的实际区别是什么?我有点困惑,因为svn只有svnco来恢复提交 补充 VonC和Charles很好地解释了git reset和git checkout之间的区别。我目前的理解是,git reset将所有更改还原回特定的提交,而git checkout或多或少地为分支做准备。我发现以下两个图表对于理解这一点非常有用: 增加3 从中

我一直认为
git reset
git checkout
是一样的,因为这两种方法都会使项目回到特定的提交状态。然而,我觉得它们不可能完全相同,因为这是多余的。两者之间的实际区别是什么?我有点困惑,因为svn只有
svnco
来恢复提交

补充 VonC和Charles很好地解释了
git reset
git checkout
之间的区别。我目前的理解是,
git reset
将所有更改还原回特定的提交,而
git checkout
或多或少地为分支做准备。我发现以下两个图表对于理解这一点非常有用:

增加3 从中,签出和重置可以模拟重基

  • 特别是更新索引,移动头部
  • 是关于更新工作树(到索引或指定树)。仅当您签出一个分支时,它才会更新头部(如果没有签出,则以一个分支结束)。
    (实际上,对于2019年第三季度的Git 2.23,这不一定是Git checkout)
相比之下,由于svn没有索引,因此只有工作树会将给定的修订复制到单独的目录中。
git checkout
更接近的等价物是:

  • (如果您位于同一分支,则表示相同的SVN URL)
  • (例如,如果您签出同一分支,但来自另一个SVN repo URL)
所有这三个工作树修改(
svn checkout
update
switch
)在git中只有一个命令:
git checkout

但是由于git也有索引(repo和工作树之间的“暂存区”)的概念,因此您也有了
git reset


提到了“”一条

例如,如果我们有两个分支,“
master
”和“
develope
”指向不同的提交,并且我们当前在“
develope
”(因此HEAD指向它)上,我们运行
git reset master
,“
develope
”本身现在将指向“
master
”所做的相同提交

另一方面,如果我们改为运行
git checkout master
,“
develope
”不会移动,
HEAD
本身会移动<代码>标题现在将指向“
master

因此,在这两种情况下,我们都将
移动到指向提交
A
,但是我们如何做是非常不同的<代码>重置将移动分支
头部
指向,签出将移动
头部
自身指向另一分支

但在这些方面:

加上:

不过,这个答案的第一段有误导性:“
git checkout
…仅当您签出分支时才会更新头部(如果没有,则最终导致头部分离)。
不正确:
git checkout
将更新头部,即使您签出的提交不是分支(是的,您最终得到的是分离的头部,但它仍然得到了更新)

同意:

@拉尔斯是对的。
第二个项目符号有一个错误的概念,即只有在签出分支时,HEAD才会更新 无论你身在何处,头都会像影子一样移动。
签出一些非分支引用(例如标记)或直接提交将移动头。分离的头部并不意味着您已经从头部分离,它意味着头部已从分支引用分离,您可以从中看到,例如,
git log--pretty=format:“%d”-1

  • 连接头状态将以
    (头->
    )开头
  • “分离”仍将显示
    (HEAD
    ,但不会有指向分支引用的箭头

最简单的形式是,
reset
重置索引而不触及工作树,而
checkout
更改工作树而不触及索引

重置索引以匹配
标题
,工作树保持不变:

git reset
从概念上讲,这会将索引签出到工作树中。要让它实际执行任何操作,您必须使用
-f
强制它覆盖任何本地更改。这是一项安全功能,可确保“无参数”表单不会具有破坏性:

git checkout
一旦开始添加参数,确实存在一些重叠

checkout
通常与分支、标记或提交一起使用。在这种情况下,它将重置
HEAD
和给定提交的索引,并将索引签出到工作树中

此外,如果您向
重置
提供
--hard
,您可以要求
重置
覆盖工作树并重置索引

如果您签出了当前分支,则当您提供备用分支或提交时,
重置
签出
之间存在重大差异。
重置
会将当前分支更改为指向所选提交,而
签出
会保留当前分支,但会签出当前分支而是提供了分支或提交

reset
commit
的其他形式涉及提供路径

如果向
reset
提供路径,则不能提供
--硬
reset
只会将所提供路径的索引版本更改为所提供提交的提交中的版本(或
如果未指定提交)

如果向
checkout
提供路径,如
reset
,它将更新所提供路径的索引版本以匹配所提供的提交(或
HEAD
),但它将始终将所提供路径的索引版本签出到工作树中。

两个命令(reset和che
git reset
git checkout
git reset HEAD           :             index = HEAD
git checkout             : file_tree = index
git reset --hard HEAD    : file_tree = index = HEAD