change “git reset--hard hash”和“git checkout hash”之間有區別嗎?



git reset all (2)

git-reset hash設置對給定哈希的分支引用,並可選擇使用--hard其檢出。

git-checkout hash將工作樹設置為給定的哈希值; 除非哈希是一個分支名稱,否則你最終會得到一個分離的頭。

最終,git處理3件事:

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

默認情況下, git-checkout只更新索引和工作樹,並且可以選擇更新存儲庫中的某些內容(使用-b選項)

默認情況下, git-reset只更新存儲庫和索引,以及可選的工作樹(使用--hard選項)

您可以像這樣想到存儲庫:

 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-reset操縱分支引用指向的內容。

假設您的歷史記錄如下:

           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 ,也就是說,HEAD指向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]

https://ffff65535.com

雖然resetcheckout在大多數情況下都有不同的用法,但我看不出這兩者之間有什麼區別。

可能有一個或沒有人會打擾添加一個 - --hard選項來做基本checkout可以做的事情。

也許你會看到歷史的方式有所不同?


如果Git提供的文檔對您沒有幫助,請查看Mark Lodato的A Visual Git Reference

特別是如果你比較git checkout <non-branch>git reset --hard <non-branch> (hotlinked):

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 - 一些提交沒有被任何分支引用。 通過reflog保護(默認)30天; 他們最終會被修剪(刪除)。





git-reset