[英]Why does git checkout file behave like reset staged file followed by checkout unstaged file?
我在 git 文檔中遇到了這個聲明:
Checking out a file is similar to using git reset with a file path, except it updates the working directory instead of the stage
鏈接: https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
部分:“Git 簽出文件”
現在假設我有一個 repo 和一個文件test.txt
在里面
起初工作目錄是干凈的:
On branch master
nothing to commit, working tree clean
現在我修改test.txt
,運行git add
和git status
現在顯示:
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
現在我運行git checkout HEAD test.txt
並得到:
Updated 1 path from 58e7043
git 狀態的git status
:
On branch master
nothing to commit, working tree clean
根據文檔,索引中test.txt
的版本應該保持不變,並且工作目錄中的版本應該已經更改回 HEAD 指向的提交中的版本,從而導致文件的不同版本在工作目錄和索引之間-> 在這種情況下git status
output 不應該是什么? 但是git status
沒有顯示 - 為什么?
通常從暫存文件到 go 到清理工作樹我必須使用git reset HEAD <filename>
然后是git checkout HEAD <filename>
在這里?
我很困惑
編輯 - 有趣的是,如果在暫存文件test.txt
后我運行git checkout test.txt
而不是git checkout HEAD test.txt
我得到:
Updated 0 paths from the index
即使這 2 個 forms 應該是等效的,而前者也默認為HEAD
(?)
我又糊塗了
首先,這不是官方文檔,在我看來,這是一個案例,Atlassian 在比較兩個命令時非常膚淺。 有時,就像這次一樣,同一個 git 命令會根據您使用的選項執行非常不同的操作。 在 SO 上,您可以找到 go 深入主題的好答案。
只是為了回答您的問題,以下是官方文檔中關於帶有 pathspec 的git checkout
的內容:
覆蓋與路徑規范匹配的文件的內容。 當
<tree-ish>
(通常是提交)沒有給出時,用索引中的內容覆蓋工作樹。 當給出<tree-ish>
時,用 <tree-ish<tree-ish>
的內容覆蓋索引和工作樹。
您處於第二種情況,其中給出了<tree-ish>
( HEAD
),這是預期的行為:索引和工作目錄都被舊版本的test.txt
覆蓋。
相反,如果您使用git checkout test.txt
,並且test.txt
已經上演,則工作目錄或索引都不會更改,因為您基本上是用索引版本替換工作目錄版本,但顯然是相同的。
Atlassian 的文章想說的是:
git checkout <pathspec>
主要在工作目錄上操作(如果提供了<tree-ish>
也可以在索引上)git reset
僅對索引起作用。 產生了誤解,因為在git reset
中將<tree-ish>
默認設置為HEAD
。 相反,如果您指定<tree-ish>
或不指定, git checkout
的行為會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.