什么';这两者之间的区别是什么;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)
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