git原理簡介
關于git原理的詳細介紹哼转,請參考git的官方中文教程做盅。這里只是有選擇性地粗略地介紹一部分。
工作區(qū)拌屏、暫存區(qū)與倉庫
工作區(qū)是指你的工程文件夾中實際能看到的(除了了
.git
文件夾)以外的你能看到的部分罚攀,這些部分的文件是可供你隨意增添党觅,刪除雌澄,修改的。如果將你工作區(qū)已更改的部分提交到暫存區(qū)杯瞻,那么將會生成這些已修改文件的快照镐牺。注意在提交到倉庫之前,所有的已修改魁莉,添加任柜,刪除的文件都要提交到暫存區(qū)。
使用提交命令后沛厨,將會有一個新的版本生成宙地。倉庫實質上可以理解成是一個記錄了所有版本的信息和具體內容的區(qū)域。
版本與分支
版本是一個對象
如果使用提交到倉庫命令逆皮,將會生成一個提交對象宅粥,這就是生成一個版本的實質過程。這個提交對象儲存了該版本的相關信息电谣,以及上述提到的文件快照的位置秽梅。這個對象以提交前HEAD
指向的對象為父對象(第一次提交時的提交對象沒有父對象)(或者說指向提交前HEAD
指向的對象)。
如果你多次提交的話剿牺,所有的提交對象就會形成“一條鏈”企垦,或者是可以理解成一條時間線。如圖所示:
分支是一個指針
分支實時上是一個指向提交對象的一個指針,每一個倉庫都會默認有一個master
分支。
其HEAD
也是一個指針傻唾,但它其實并不是直接指向提交對象的,它是一個指向分支指針的指針荧降。HEAD
指向的分支所指的提交對象表示“當前的版本”。
git分支管理
分支的創(chuàng)建與合并
下面是一些基本命令
git branch <branchname>
//創(chuàng)建新分支攒读,默認指向HEAD版本
git checkout <branchname>
//切換到某個分支(意思是HEAD指向該分支朵诫,暫存區(qū)清空,工作區(qū)切換到該分支指向的版本)
git checkout -b <branchname>
//創(chuàng)建新分支薄扁,并切換到該分支
git branch
//查看當前分支
git merge <branchname>
//將當前分支與指定的分支合并
這里重申一下commit要做的事情:
生成一個提交對象剪返,指向上一個對象,之后HEAD指向的分支指向這個新的提交對象邓梅。最后清空暫存區(qū)脱盲。此時工作區(qū)內容也應與當前HEAD版本一致。
再重申一下回退(即切換版本)要做的事情:
將HEAD指向的分支指向某個提交對象震放,清空暫存區(qū)宾毒,并將工作區(qū)內容切換到與當前HEAD版本一致驼修。
通過以上幾點可以發(fā)現(xiàn):
只要HEAD版本(意思是HEAD指向的分支所指的提交對象對應的版本)發(fā)生了改變殿遂。暫存區(qū)將會被清空诈铛,工作區(qū)也將會被切換到與HEAD版本一致的狀態(tài)。
如果分別在不同的分支進行提交墨礁,將可能會出現(xiàn)多個提交對象指向同一個提交對象的情況幢竹。那么我們之前所提及的“一條鏈”的結構便不復存在了。而是一種“樹形結構”恩静。