簡體   English   中英

Git 如何在內部恢復索引和工作目錄(在重置/結帳時)?

[英]How does Git restore index and wokring directory internally (upon reset/checkout)?

我了解當我checkout出或reset --hard到特定的提交/分支時,我會在我的工作目錄和索引文件中獲得相關內容。

但是 Git 如何在checkoutreset --hard

是否通過讀取我們已簽出/重置到的提交指向的樹來完成索引恢復?

工作目錄是否也以同樣的方式恢復?

這是否意味着在reset --hardcheckout <some_branch>之后,索引和工作目錄將始終與該提交的樹匹配,因為它們是從中重建的?


編輯:我基本上要問的是:索引/WD 內容的恢復是使用我們到達的提交指向的樹完成的嗎? 因為在我看來,git 沒有其他方法可以獲取該內容,而不是從提交歷史記錄中獲取

這是否意味着在 reset --hard 或 checkout 之后,索引和工作目錄將始終與該提交的樹匹配,因為它們是從中重建的?

簡短的回答:是的

長答案:

git checkout

更新工作樹中的文件以匹配索引或指定樹中的版本。

https://git-scm.com/docs/git-checkout

git-reset --hard

重置索引和工作樹。 此后對工作樹中跟蹤文件的任何更改都將被丟棄。

https://git-scm.com/docs/git-reset

這兩個命令都會移動HEAD ,然后檢查它被移動到的任何提交,並相應地更改索引和/或 WD。 如果它不改變一個或兩個,它仍然充當該提交時文件的 state 的保管者,並允許您運行命令以將您的 WD 和索引與當時文件的 state 進行比較時間。

我希望這會有所幫助,我不確定您的問題到底在尋找什么。

不完全是。 至少,不適用於工作目錄。

老實說,我花了幾分鍾才弄清楚你的問題可能意味着什么。 您是在詢問工作目錄是否會在運行您說您知道將工作目錄設置為匹配簽出提交的命令后最終匹配簽出提交,所以問題是......有點模糊。

但是在某些情況下,工作目錄最終會與簽出提交中的內容不同。 例如,被忽略(或未跟蹤)的文件通常不會受到干擾。 在某些情況下這是不可能的; 也許我有一個名為foo的未跟蹤文件,但目標樹在同一路徑有一個也名為foo的文件。 不同的命令處理不同。 (這里需要注意的是, checkout commit是一個非常不同於checkout commit -- path的命令。)一些命令會破壞你的本地未跟蹤數據(然后將無法恢復,至少就任何 git 機制而言),而其他人會中止並警告您本地更改將被覆蓋。

因此,說工作樹是從目標樹“重建”是不完全正確的 - 因為目錄不是完全rm 'd 然后從樹數據重新創建的。 而是根據需要添加、刪除或替換文件(無論如何這是一個更有效的過程)。

對於索引:很難顯示索引沒有完全重建的任何“症狀”,因為索引中沒有與未跟蹤文件類似的概念。 我希望 git 能夠利用它為所有內容存儲的哈希值,這樣它就會再次更改需要更改的內容,而不是完全重建; 但在這種情況下,我不能 100% 確定,這是一個並不重要的實現細節。 如果您告訴 git 設置索引以匹配提交,則索引將匹配提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM