git-checkout和git-reset有什么区别?

时间:2015-08-27 12:53:20

标签: git version-control

我在分支上有两个标签。每当我执行git reset old_tag时,它会将头部更改为old_tag,并表示我已经落后于1次提交(这是预期的)。但是,git checkout old_tag给了一个独立的头。

据我了解,git reset只更改头部指针。对于git checkout,我总是使用它来切换分支或签出新分支中的某个提交。但我从来没有使用它来检查一个提交所有自己没有分支。 所以,如果它总是给出一个独立的头,为什么它首先允许自己检查一个提交?

更新:粗体部分是我的问题和推荐的重复问题之间的区别。

3 个答案:

答案 0 :(得分:0)

来源于documentation

git-checkout - 切换分支或恢复工作树文件。或者完美描述为:

  

更新工作树中的文件以匹配索引中的版本或   指定的树。如果没有给出路径,git checkout也会更新HEAD以将指定的分支设置为当前分支。

git-reset - 将当前HEAD重置为指定状态

答案 1 :(得分:0)

根据评论中的讨论,已达成以下内容:

git-reset

将头部更改为不同的提交/标签...如果您当前正在重置头部:

  1. 在树枝上。
  2. 分离状态。

    但git reset不会让你进入分离状态。

  3. git-checkout

    1. 用于创建分支并在其中签出提交
    2. 在分支机构之间切换
    3. 让你处于分离状态(如果你签出了 自己提交)。
    4. 最后一次使用是关于我的问题。有时,您不希望重置当前分支以尝试旧提交。但是进入具有特定提交的分离状态并使用该旧状态。只有get checkout会让您进入该状态,这不能通过git reset实现,因为它只会重置分支(或者如果处于分离状态也可以重置)但不会让您处于分离状态。

答案 2 :(得分:0)

一个独立的头部情况并不常见。但是,确保您不会提交任何内容可能会很有趣。

您无法使用git-reset获得分离的情况,因为它的作用是移动您当前的分支(可能是您的舞台区域和工作目录,具体取决于您使用的选项)。

git-reset不仅仅是移动HEAD。它会移动您指定的branchHEADStaged Area

您只移动分支和HEAD:

git reset --soft tag/SHA1/branch2

您将分支,HEAD和Stage Area移动到:

git reset --mixed tag/SHA1/branch2 //It is the default option

使用以下命令移动分支,HEAD,Stage Area和Working目录:

git reset --hard tag/SHA1/branch2