代码之家  ›  专栏  ›  技术社区  ›  Bite code

“git reset--hard hash”和“git checkout hash”有区别吗?

  •  42
  • Bite code  · 技术社区  · 14 年前

    同时 reset checkout 大多数时候都有不同的用法,我看不出这两者有什么区别。

    可能有一个或没有人会费心添加 --hard 选择做一些基本的事情 结帐 能做到。

    也许你看历史的方式不同?

    3 回复  |  直到 9 年前
        1
  •  53
  •   Community SushiHangover    7 年前

    这个答案大部分是从我对前一个问题的回答中引用的: git reset in plain english .

    这两者截然不同。它们为索引树和工作树生成相同的状态,但生成的历史记录和当前分支不相同。

    假设您的历史是这样的,主分支当前已签出:

    - A - B - C (HEAD, master)
    

    然后你就跑 git reset --hard B . 你会得到这个:

    - A - B (HEAD, master)      # - C is still here, but there's no
                                # branch pointing to it anymore
    

    如果你使用 --mixed --soft 同样-唯一的区别是你的工作树和索引会发生什么。在 --hard 案例、工作树和索引匹配 B .

    现在,假设你会跑 git checkout B 相反。你会得到这个:

    - A - B (HEAD) - C (master)
    

    你最终进入了一种超然的状态。 HEAD ,工作树,索引全部匹配 与硬重置相同,但主分支被留在 C .如果你做出新的承诺 D 在这一点上,你会得到这个,这可能不是你想要的:

    - A - B - C (master)
           \
            D (HEAD)
    

    所以,您使用check out来检查提交。你可以随意摆弄它,做你喜欢做的事,但你已经把你的分支丢在后面了。如果希望分支也移动,则使用重置。

        2
  •  14
  •   Jakub Narębski adamtaub    12 年前

    如果Git提供的文档对您没有帮助,请查看 A Visual Git Reference Mark Lodato。

    尤其是如果你在比较 git checkout <non-branch> 具有 git reset --hard <non-branch> (热链接):

    git checkout master~3 http://marklodato.github.com/visual-git-guide/checkout-detached.svg.png

    git reset --hard master~3 http://marklodato.github.com/visual-git-guide/reset-commit.svg.png

    注意,在 git reset --hard master~3 您将保留DAG的一部分修订内容—某些提交内容没有被任何分支引用。保护期限(默认情况下)为30天 重新浮起 它们最终会被修剪(移除)。

        3
  •  6
  •   hasen    14 年前

    git-reset hash 设置对给定哈希的分支引用,并使用 --hard .

    git-checkout hash 将工作树设置为给定的哈希;除非哈希是分支名称,否则最终将得到一个分离的头。

    最终,Git处理三件事:

                       working tree (your code)
    -------------------------------------------------------------------------
                         index/staging-area
    -------------------------------------------------------------------------
          repository (bunch of commits, trees, branch names, etc)
    

    git-checkout 默认情况下,只更新索引和工作树,并且可以选择更新存储库中的某些内容(使用 -b 选择权

    git-reset 默认情况下,只需更新存储库和索引,以及可选的工作树(使用 --硬 选项)

    您可以这样想存储库:

     HEAD -> master
    
     refs:
        master -> sha_of_commit_X
        dev -> sha_of_commit_Y
    
     objects: (addressed by sha1)
    
        sha_of_commit_X, sha_of_commit_Y, sha_of_commit_Z, sha_of_commit_A ....
    

    Git复位 操纵分支引用指向的内容。

    假设你的历史是这样的:

               T--S--R--Q [master][dev]
              / 
       A--B--C--D--E--F--G [topic1]
                       \
                        Z--Y--X--W [topic2][topic3]
    

    记住,分支只是在提交时自动前进的名称。

    因此,您有以下分支:

     master -> Q
     dev -> Q
     topic1 -> G
     topic2 -> W
     topic3 -> W
    

    你现在的分支机构是 topic2 也就是说,头部指向topic2。

    HEAD -> topic2
    

    然后, git reset X 将重置名称 TopIC2 指向x;意味着如果您在分支topic2上提交p,事情将如下所示:

               T--S--R--Q [master][dev]
              / 
       A--B--C--D--E--F--G [topic1]
                       \
                        Z--Y--X--W [topic3]
                               \
                                P [topic2]