<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://jiva.dila.edu.tw/index.php?action=history&amp;feed=atom&amp;title=Pro_Git_1.3_Git_%E5%9F%BA%E7%A4%8E%E8%A6%81%E9%BB%9E</id>
	<title>Pro Git 1.3 Git 基礎要點 - 修訂歷史</title>
	<link rel="self" type="application/atom+xml" href="https://jiva.dila.edu.tw/index.php?action=history&amp;feed=atom&amp;title=Pro_Git_1.3_Git_%E5%9F%BA%E7%A4%8E%E8%A6%81%E9%BB%9E"/>
	<link rel="alternate" type="text/html" href="https://jiva.dila.edu.tw/index.php?title=Pro_Git_1.3_Git_%E5%9F%BA%E7%A4%8E%E8%A6%81%E9%BB%9E&amp;action=history"/>
	<updated>2026-05-05T16:57:22Z</updated>
	<subtitle>本 Wiki 上此頁面的修訂歷史</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://jiva.dila.edu.tw/index.php?title=Pro_Git_1.3_Git_%E5%9F%BA%E7%A4%8E%E8%A6%81%E9%BB%9E&amp;diff=517&amp;oldid=prev</id>
		<title>imported&gt;Ray：​新頁面: 那麼，簡單地說，Git 究竟是怎樣的一個系統呢？請注意，接下來的內容非常重要，若是理解了 Git 的思想和基本的工作原理，用起來就會知其...</title>
		<link rel="alternate" type="text/html" href="https://jiva.dila.edu.tw/index.php?title=Pro_Git_1.3_Git_%E5%9F%BA%E7%A4%8E%E8%A6%81%E9%BB%9E&amp;diff=517&amp;oldid=prev"/>
		<updated>2011-05-24T05:35:51Z</updated>

		<summary type="html">&lt;p&gt;新頁面: 那麼，簡單地說，Git 究竟是怎樣的一個系統呢？請注意，接下來的內容非常重要，若是理解了 Git 的思想和基本的工作原理，用起來就會知其...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新頁面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;那麼，簡單地說，Git 究竟是怎樣的一個系統呢？請注意，接下來的內容非常重要，若是理解了 Git 的思想和基本的工作原理，用起來就會知其所以然，遊刃有餘。在開始學習 Git 的時候，請不要嘗試把各種概念和其他的版本控制系統諸如 Subversion 和 Perforce 等相比擬，否則容易混淆每個操作的實際意義。Git 在保存和處理各種資訊的時候，雖然操作起來的命令形式非常相近，但它與其他版本控制系統的做法頗為不同。理解這些差異將有助於你準確地使用 Git 提供的各種工具。&lt;br /&gt;
&lt;br /&gt;
=直接快照，而非比較差異=&lt;br /&gt;
&lt;br /&gt;
Git 和其他版本控制系統的主要差別在於，Git 只關心檔資料的整體是否發生變化，而大多數其他系統則只關心檔內容的具體差異。這類系統（CVS，Subversion，Perforce，Bazaar 等等）每次記錄有哪些檔作了更新，以及都更新了哪些行的什麼內容，請看圖 1-4。&lt;br /&gt;
&lt;br /&gt;
[[圖片:pro-git-1-4.png]]&lt;br /&gt;
圖 1-4. 其他系統在每個版本中記錄著各個檔的具體差異&lt;br /&gt;
&lt;br /&gt;
Git 並不保存這些前後變化的差異資料。實際上，Git 更像是把變化的檔作快照後，記錄在一個微型的檔案系統中。每次提交更新時，它會縱覽一遍所有檔的指紋資訊並對檔作一快照，然後保存一個指向這次快照的索引。為提高性能，若檔沒有變化，Git 不會再次保存，而只對上次保存的快照作一連接。Git 的工作方式就像圖 1-5 所示。&lt;br /&gt;
&lt;br /&gt;
[[圖片:pro-git-1-5.png]]&lt;br /&gt;
圖 1-5. Git 保存每次更新時的檔快照&lt;br /&gt;
&lt;br /&gt;
這是 Git 同其他系統的重要區別。它完全顛覆了傳統版本控制的套路，並對各個環節的實現方式作了新的設計。Git 更像是個小型的檔案系統，但它同時還提供了許多以此為基礎的超強工具，而不只是一個簡單的 VCS。稍後在第三章討論 Git 分支管理的時候，我們會再看看這樣的設計究竟會帶來哪些好處。&lt;br /&gt;
&lt;br /&gt;
=近乎所有操作都可本地執行=&lt;br /&gt;
&lt;br /&gt;
在 Git 中的絕大多數操作都只需要訪問本地檔和資源，不用連網。但如果用 CVCS 的話，差不多所有操作都需要連接網路。因為 Git 在本地磁片上就保存著所有有關當前專案的歷史更新，所以處理起來速度飛快。&lt;br /&gt;
&lt;br /&gt;
舉個例子，如果要流覽項目的歷史更新摘要，Git 不用跑到外面的伺服器上去取資料回來，而直接從本地資料庫讀取後展示給你看。所以任何時候你都可以馬上翻閱，無需等待。如果想要看當前版本的檔和一個月前的版本之間有何差異，Git 會取出一個月前的快照和當前檔作一次差異運算，而不用請求遠端伺服器來做這件事，或是把老版本的檔拉到本地來作比較。&lt;br /&gt;
&lt;br /&gt;
用 CVCS 的話，沒有網路或者斷開 VPN 你就無法做任何事情。但用 Git 的話，就算你在飛機或者火車上，都可以非常愉快地頻繁提交更新，等到了有網路的時候再上傳到遠端的鏡像倉庫。同樣，在回家的路上，不用連接 VPN 你也可以繼續工作。換作其他版本控制系統，這麼做幾乎不可能，抑或非常麻煩。比如 Perforce，如果不連到伺服器，幾乎什麼都做不了（譯注：實際上手工修改檔許可權改為可寫之後是可以編輯檔的，只是其他開發者無法通過 Perforce 知道你正在對此檔進行修改。）；如果是 Subversion 或 CVS，雖然可以編輯檔，但無法提交更新，因為資料庫在網路上。看上去好像這些都不是什麼大問題，但在實際體驗過之後，你就會驚喜地發現，這其實是會帶來很大不同的。&lt;br /&gt;
&lt;br /&gt;
=時刻保持資料完整性=&lt;br /&gt;
&lt;br /&gt;
在保存到 Git 之前，所有資料都要進行內容的校驗和（checksum）計算，並將此結果作為資料的唯一標識和索引。換句話說，不可能在你修改了檔或目錄之後，Git 一無所知。這項特性作為 Git 的設計哲學，建在整體架構的最底層。所以如果檔在傳輸時變得不完整，或者磁片損壞導致檔資料缺失，Git 都能立即察覺。&lt;br /&gt;
&lt;br /&gt;
Git 使用 SHA-1 演算法計算資料的校驗和，通過對檔的內容或目錄的結構計算出一個 SHA-1 雜湊值，作為指紋字串。該字串由 40 個十六進位字元（0-9 及 a-f）組成，看起來就像是：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;XML&amp;quot;&amp;gt;24b9da6552252987aa493b52f8696cd6d3b00373&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git 的工作完全依賴於這類指紋字串，所以你會經常看到這樣的雜湊值。實際上，所有保存在 Git 資料庫中的東西都是用此雜湊值來作索引的，而不是靠檔案名。&lt;br /&gt;
&lt;br /&gt;
=多數操作僅添加資料=&lt;br /&gt;
&lt;br /&gt;
常用的 Git 操作大多僅僅是把資料添加到資料庫。因為任何一種不可逆的操作，比如刪除資料，要回退或重現都會非常困難。在別的 VCS 中，若還未提交更新，就有可能丟失或者混淆一些修改的內容，但在 Git 裡，一旦提交快照之後就完全不用擔心丟失資料，特別是在養成了定期推送至其他鏡像倉庫的習慣的話。&lt;br /&gt;
&lt;br /&gt;
這種高可靠性令我們的開發工作安心不少，儘管去做各種試驗性的嘗試好了，再怎樣也不會弄丟資料。至於 Git 內部究竟是如何保存和恢復資料的，我們會在第九章的“幕後細節”部分再作詳述。&lt;br /&gt;
&lt;br /&gt;
=三種狀態=&lt;br /&gt;
&lt;br /&gt;
好，現在請注意，接下來要講的概念非常重要。&amp;lt;br&amp;gt;&lt;br /&gt;
對於任何一個檔，在 Git 內都只有三種狀態：已提交（committed），已修改（modified）和已暫存（staged）。&amp;lt;br&amp;gt;&lt;br /&gt;
已提交表示該檔已經被安全地保存在本地資料庫中了；已修改表示修改了某個檔，但還沒有提交保存；已暫存表示把已修改的檔放在下次提交時要保存的清單中。&lt;br /&gt;
&lt;br /&gt;
由此我們看到 Git 管理專案時，檔案流轉的三個工作區域：Git 的本地資料目錄，工作目錄以及暫存區域。&lt;br /&gt;
&lt;br /&gt;
[[圖片:pro-git-1-6.png]]&lt;br /&gt;
圖 1-6. 工作目錄，暫存區域和 git 目錄&lt;br /&gt;
&lt;br /&gt;
每個專案都有一個 git 目錄，它是 Git 用來保存中繼資料和物件資料庫的地方。&amp;lt;br&amp;gt;&lt;br /&gt;
該目錄非常重要，每次克隆鏡像倉庫的時候，實際拷貝的就是這個目錄裡面的資料。&lt;br /&gt;
&lt;br /&gt;
從專案中取出某個版本的所有檔和目錄，用以開始後續工作的叫做工作目錄。&amp;lt;br&amp;gt;&lt;br /&gt;
這些檔實際上都是從 git 目錄中的壓縮物件資料庫中提取出來的，接下來就可以在工作目錄中對這些檔進行編輯。&lt;br /&gt;
&lt;br /&gt;
所謂的暫存區域只不過是個簡單的檔，一般都放在 git 目錄中。&amp;lt;br&amp;gt;&lt;br /&gt;
有時候人們會把這個檔叫做索引檔，不過標準說法還是叫暫存區域。&lt;br /&gt;
&lt;br /&gt;
基本的 Git 工作流程如下所示：&lt;br /&gt;
&lt;br /&gt;
# 在工作目錄中修改某些檔。 &lt;br /&gt;
# 對這些修改了的檔作快照，並保存到暫存區域。 &lt;br /&gt;
# 提交更新，將保存在暫存區域的檔快照轉儲到 git 目錄中。&lt;br /&gt;
&lt;br /&gt;
所以，我們可以從檔所處的位置來判斷狀態：如果是 git 目錄中保存著的特定版本檔，就屬於已提交狀態；如果作了修改並已放入暫存區域，就屬於已暫存狀態；如果自上次取出後，作了修改但還沒有放到暫存區域，就是已修改狀態。&amp;lt;br&amp;gt;&lt;br /&gt;
到第二章的時候，我們會進一步瞭解個中細節，並學會如何善用這些狀態，以及如何跳過暫存環節。&lt;/div&gt;</summary>
		<author><name>imported&gt;Ray</name></author>
	</entry>
</feed>