簡體   English   中英

為什么 git 檢出文件的行為類似於重置暫存文件,然后檢出未暫存文件?

[英]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 addgit 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.

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