Git是一個用于多人協(xié)作的版本控制工具贵扰,十分強大齿诉。不過當你興致勃勃地想要在項目中使用起Git時,卻發(fā)現(xiàn)其還是有一定的學習成本的屿讽。網(wǎng)上的Git介紹內(nèi)容很多屿储,不過都是介紹Git是什么贿讹,以及Git怎么用。這里我想從另個一角度來學習Git扩所,即Git為什么這么設計
一围详、最原始的版本控制方法
階段一
假如你是一個計算機小白朴乖,沒有接觸過任何的版本控制工具祖屏,當你在進行一個項目,比如說买羞,在完成你的畢業(yè)論文設計的時候袁勺,可能會遇到什么樣的問題呢?論文不斷地修修改改畜普,改完了一版期丰,但是原來的版本又不忍心刪掉,因為當前這一版又有問題吃挑,需要打回改為原來的版本(orz)钝荡,這時候,你的文件夾可能會是這樣的:
- 論文-初稿
- 論文-1.0
- 論文-終版
- 論文-終版1.0
- 論文-終版(打死不修改版)
- 論文-終版2.0
- ……
這樣子舶衬,隨著修改的版本不斷增加埠通,你的文件也在不斷地增長。好處是你可以隨時隨地找到之前的某一個版本(所見即所得)逛犹,但是壞處也是有的:
- 文件越來越多端辱,越來越占空間
- 難以管理(如何命名、如何確保文件不丟失……)
- 如何對比兩個版本之間的差異
有沒有什么好的體驗呢虽画?
方案一:假如舞蔽,文件夾中就只有一個文件,保存的時候【選擇一個版本號】码撰。我在右擊的時候渗柿,可以顯示所有的版本號,并選擇對應的內(nèi)容
這樣子脖岛,是不是很方便了呢朵栖?砾省!文件夾中只有一個文件,簡單清晰混槐,并且又有不同的版本可以選擇编兄,真的贊。
階段二
不過声登,下一個問題來了:剛才的例子中狠鸳,我們只有一個文件,那假如我們還有別的一些相關素材呢:
- 論文-正稿
- 參考資料
如果按照【方案一】悯嗓,我們每次保存論文的時候件舵,需要記住一個版本,保存是參考資料的時候脯厨,也要記住一個版本铅祸,豈不是也很麻煩?
方案二:這個文件夾下的所有內(nèi)容都同屬一個版本合武,每次修改都保存在最新的版本临梗。我們可以將所有的文件一起提交到一個版本,也可以將所有的文件都恢復到之前的某個版本
方案二好像就解決了我們的問題了
階段三
假如你已經(jīng)完成了一版【最終版1.0】稼跳,然后忽然想到盟庞,之前的某個觀點,如果按照別的一個思路汤善,可能會有別的結果什猖。于是你就切回到之前的某個版本,進行修改保存红淡。然后發(fā)現(xiàn)靈思泉涌不狮,按照這個思路,又寫到了【最終版-世界線變動-1.0】
但是這時候在旱,怎么把【最終版1.0】的修改和當前的修改整合呢摇零?復制當前內(nèi)容,跳回到【最終版1.0】颈渊,然后手動將兩部分的差異對比遂黍,合并,保存為【最終版-世界線收束-1.0】俊嗽?實際上雾家,思路也是對的(又不是不能用.jpg),只是手動復制和修改差異绍豁,的確不友好芯咧,最好是軟件可以幫我們做一下,比如說復制這一步
二、Git實際上是怎么做的呢敬飒?
首先:Git是如何管理文件的邪铲?
如果我們想要每一個版本都有整個文件夾的內(nèi)容,最簡單的方案是每一個版本都將當前文件夾下所有內(nèi)容都存儲下來无拗!這樣的話带到,我們粗粗一想,就有兩種方案:
- 每次將全部的數(shù)據(jù)都存一份英染。但是這樣子會比較耗費空間揽惹。不過我們可以將其壓縮一下
- 每次都存儲和上一次的差異。這樣子存儲的數(shù)據(jù)就會相對較少四康。不過當我們要去找到某一版搪搏,便需要從最開始的版本,將所有的差異一一計算上去闪金。會比較慢
實際上疯溺,Git是采用了第一種方式來的。我們可以驗證下:
git init # 初始git倉庫
echo 'wakanda forever' > wow.txt # 新建一個文件哎垦,內(nèi)容為'wakanda forever'
git add wow.txt #將wow.txt加入緩沖區(qū)
git ci -m 'add wow.txt' #將wow.txt提交
這里Git做了什么事情呢囱嫩?
- 根據(jù)wow.txt生成一段哈希碼
- 將wow.txt進行壓縮,存儲在目錄
.git/objects
下
我們實地看一下撼泛,在當前目錄下:git hash-object wow.txt
挠说,可以查看到這個文件對應的hash碼f92251815271e6bc28e5a7f9c24c5b5feadf5550
澡谭。然后我們到.git/objects
目錄下看一下:
├── 96
│ └── 702f5ef2d4d580ddbad1bc95858180bb12cc1f
├── be
│ └── 40ca1d8339f9864ffa3c1ac3a284ecb2e4c931
├── f9
│ └── 2251815271e6bc28e5a7f9c24c5b5feadf5550
├── info
└── pack
這里的Git會根據(jù)文件的hash碼前兩位劃分目錄愿题,我們wow.txt對應的就是f9
下225
開頭的文件。直接cat f9/2251815271e6bc28e5a7f9c24c5b5feadf5550
會發(fā)現(xiàn)這個文件是亂碼蛙奖,因為我們剛才提到潘酗,這是一個被壓縮的二進制文件。我們可以使用命令git cat-file -p f92251815271e6bc28e5a7f9c24c5b5feadf5550
來查看原有的內(nèi)容:wakanda forever
當當雁仲!