為什麼 Git 錯誤地指出我的文件是最新的?

為什麼 Git 錯誤地指出我的文件是最新的?

我的檔案目錄中有兩個資料夾 A 和 B,它們連結到同一個 Git 儲存庫。

我在資料夾 A 中建立了一個名為index.html.然後,我會建立一個不同的文件,也稱為index.html資料夾index.htmlB。

當我從資料夾 A 中提取文件時,Git 聲稱我的文件「已經是最新的」。然而,這兩個資料夾顯然有不同的index.html文件。到底是怎麼回事?

答案1

git pull的工作是fetch新的提交並將merge它們放入當前分支。如果當前分支與您從中提取的分支相比沒有過時,則 pull 會說Already up-to-date. 即使您的工作目錄中有本地更改git pull關注的是分支,而不是工作樹——只有當存在幹擾合併的變更時,它才會對工作樹進行評論。

您的描述不足以解釋為什麼它不反對現有的index.html,但您不應該認為Already up-to-date.git 認為您沒有任何更改。相反,使用git status來獲取摘要。

為了了解分支的狀態,git branch -v它很有用(它顯示提交 ID 以及與每個分支的上游分支的關係),或gitk --all用於所有提交的圖形視圖。

答案2

如果我理解正確,以下腳本應該會重現您的問題:

mkdir測試
光碟測試
git init --裸測試.git
git 克隆 test.git a
git 克隆 test.git b
回顯 > a/index.html
迴聲 b > b/index.html
光碟
git 新增索引.html
git commit -m 添加
git推送原點大師
光碟../a
git拉

最後git pull列印:

遠端:計數物件:3,完成。
遠端:總計 3 個(增量 0),重複使用 0 個(增量 0)
拆開物體:100% (3/3),完成。
來自/home/cyrus/tmp/test/test
 * [新分支] master -> origin/master

而 的內容index.html已經被默默地覆蓋了:

賽勒斯:~/tmp/test/a$ cat index.html

答案3

請記住一件事git——它追蹤內容,而不是文件

在內部,存儲庫保留的所有內容都是斑點某處。您所認為的檔案git實際上是指向 blob 的名稱。您認為是具有相同內容的兩個文件,git實際上是連結到同一 blob 的兩個名稱。因此,由於所有 blob 都沒有更改,因此儲存庫也沒有更改。

您期望 git 像您的檔案系統一樣工作(或者可能像大多數其他版本控制系統一樣) -git實際上在這方面更節省空間。這本書很好地解釋了這個概念 - 具體來說,Git 物件模型

答案4

看起來你已經習慣了 SVN,其中不同的資料夾(甚至文件,不知道)可以簽出不同的修訂版本。

這對 git 來說是不可能的。與您所在的資料夾無關,提交或簽出(這也是成功拉取的最後一步)對所有工作文件進行操作,與您目前所在的資料夾無關。

相關內容