Git歷險記(四) 索引與提交的幕後故事

2021-09-16 18:23:15 字數 2484 閱讀 1468

\u0026#xd;\n

我想如果看過《git歷險記》的前面三篇文章的朋友可能已經知道怎麼用git add,git commit這兩個命令了;知道它們乙個是把檔案暫存到索引中為下一次提交做準備,乙個建立新的提交(commit)。但是它們台前幕後的一些有趣的細節大家不一定知曉,請允許我一一道來。

\u0026#xd;\n

git 索引是乙個在你的工作目錄(working tree)和專案倉庫間的暫存區域(staging area)。有了它, 你可以把許多內容的修改一起提交(commit)。 如果你建立了乙個提交(commit),那麼提交的一般是暫存區裡的內容, 而不是工作目錄中的內容。

\u0026#xd;\n

乙個git專案中檔案的狀態大概分成下面的兩大類,而第二大類又分為三小類:

\u0026#xd;\n

未被跟蹤的檔案(untracked file)\u0026#xd;\n

已被跟蹤的檔案(tracked file)\u0026#xd;\n

被修改但未被暫存的檔案(changed but not updated或modified)\u0026#xd;\n

已暫存可以被提交的檔案(changes to be committed 或staged)\u0026#xd;\n

自上次提交以來,未修改的檔案(clean 或 unmodified)\u0026#xd;\n

\u0026#xd;\n

我們先來建乙個空的專案:

\u0026#xd;\n

\u0026#xd;\n$rm -rf stage_proj\u0026#xd;\n$mkdir stage_proj\u0026#xd;\n$cd stage_proj\u0026#xd;\n$git init\u0026#xd;\ninitialized empty git repository in /home/test/work/test_stage_proj/.git/\u0026#xd;\n
\u0026#xd;\n

我們還建立乙個內容是「hello, world」的檔案:

\u0026#xd;\n

\u0026#xd;\n$echo \"hello,world\" \u0026gt; readme.txt
\u0026#xd;\n
\u0026#xd;\n$git status\u0026#xd;\n# on branch master\u0026#xd;\n#\u0026#xd;\n# initial commit\u0026#xd;\n#\u0026#xd;\n# untracked files:\u0026#xd;\n#   (use \"git add \u0026lt;file\u0026gt;...\" to include in what will be committed)\u0026#xd;\n#\u0026#xd;\n#   readme.txt\u0026#xd;\nnothing added to commit but untracked files present (use \"git add\" to track)\u0026#xd;\n
\u0026#xd;\n

把「readme.txt\"加到暫存區: $git add readme.txt

\u0026#xd;\n

現在再看一下當前工作目錄的狀態:

\u0026#xd;\n

\u0026#xd;\n$git status\u0026#xd;\n# on branch master\u0026#xd;\n#\u0026#xd;\n# initial commit\u0026#xd;\n#\u0026#xd;\n# changes to be committed:\u0026#xd;\n#   (use \"git rm --cached \u0026lt;file\u0026gt;...\" to unstage)\u0026#xd;\n#\u0026#xd;\n#   new file:   readme.txt\u0026#xd;\n#\u0026#xd;\n
\u0026#xd;\n

可以看到現在\"readme.txt\"的狀態變成了已暫存可以被提交(changes to be committed),這意味著我們下一步可以直接執行「git commit「把這個檔案提交到本地的倉庫裡去了。

\u0026#xd;\n

暫存區(staging area)一般存放在「git目錄「下的index檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index)。索引是乙個二進位制格式的檔案,裡面存放了與當前暫存內容相關的資訊,包括暫存的檔名、檔案內容的sha1雜湊串值和檔案訪問許可權,整個索引檔案的內容以暫存的檔名進行排 序儲存的。

\u0026#xd;\n

但是我不想馬上就把檔案提交,我想看一下暫存區(staging area)裡的內容,我們執行git ls-files命令看一下:

\u0026#xd;\n

\u0026#xd;\n$git ls-files --stage\u0026#xd;\n100644 2d832d9044c698081e59c322d5a2a459da546469 0   readme.txt\u0026#xd;\n
\u0026#xd;\n

Git世界歷險記

git 屬於分散型版本管理系統,是為版本管理而而設計的軟體。linux的創始人linus torvalds在2005年開發了git的原型程式,在此之前人們大多選用subversion作為版本管理軟體 版本管理 版本管理就是管理更新的歷史記錄,它為我們提供了一些在軟體開發過程中必不可少的功能,例如記錄...

刻盤歷險記

晚上,由於 n有一些學習資料需要刻盤,經過整理決定分別刻一張 r 和一張cd r 而家裡的台式電腦的 usb口是 1.1的,從行動硬碟拷貝檔案到電腦中速度很慢 1g 東西要大概 20分鐘 我一時犯懶就沒用筆記本聯網拷,一口氣將4個多 g東西一點點從移硬拷到台式電腦中了,用了 1個半小時之久,當然這段...

丁丁歷險記

丁丁歷險記 丁丁出來遊玩,看見冒險樂園,想玩極了,可該睡覺了,那改天吧!姐姐,休息一下下!丁丁爬了山,虛脫至極,一屁股坐下,一驚,被攥的緊緊的手機消失了!丁丁快速回想,只在前面休息過呀,當時手機消失了嗎?哎呀呀,就是想不起來了。想原路返回,可疲憊拖住了她的步伐,躊躇不前,求助於導遊。原本記得不太清晰...