設(shè)想你現(xiàn)在位于?alpha/?目錄下,這里有一個(gè)文本文件?number.txt,里面的內(nèi)容只有一個(gè)詞:“first”。
現(xiàn)在執(zhí)行?git?init?將這個(gè)?alpha?文件夾初始化為?Git?倉(cāng)庫(kù)。
執(zhí)行?git?add?number.txt?會(huì)將?number.txt?添加到?Git?的索引(index)中。這個(gè)索引記錄了所有?Git?保持追蹤的文件,現(xiàn)在它有了一個(gè)映射記錄?number.txt?->?first,同時(shí)?add?命令還會(huì)把一個(gè)包含了?first?字符串的二進(jìn)制對(duì)象加入?Git?的對(duì)象數(shù)據(jù)庫(kù)里。
現(xiàn)在執(zhí)行?git?commit?-m?first。這條命令會(huì)做三件事情。首先在對(duì)象數(shù)據(jù)庫(kù)內(nèi)創(chuàng)建一個(gè)樹(shù)對(duì)象,用以記錄?alpha?目錄下的文件列表,這個(gè)對(duì)象有一個(gè)指針指向前面?git?add?命令創(chuàng)建的?first?二進(jìn)制對(duì)象;第二,這條命令還會(huì)創(chuàng)建一個(gè)?commit?對(duì)象用以代表剛剛提交的版本,它包含一個(gè)指針指向剛剛的樹(shù)對(duì)象;第三,master?分支也會(huì)指向這個(gè)新創(chuàng)建的?commit?對(duì)象。
現(xiàn)在執(zhí)行?git?clone?.?../beta。它會(huì)創(chuàng)建一個(gè)新目錄?beta?并將其初始化為?Git?倉(cāng)庫(kù),然后把?alpha?倉(cāng)庫(kù)的對(duì)象數(shù)據(jù)庫(kù)中所有對(duì)象拷貝給?beta?的對(duì)象數(shù)據(jù)庫(kù),將?beta?的?master?分支像?alpha?的?master?一樣指向相應(yīng)的對(duì)象。它還根據(jù)?first提交的內(nèi)容配置索引,并根據(jù)索引更新目錄下的文件——也就是?number.txt。
現(xiàn)在切換到?beta?目錄,修改?number.txt?的內(nèi)容為“second”,執(zhí)行?git?add?number.txt?和?git?commit?-m?second,新創(chuàng)建的提交對(duì)象?second(譯注:姑且稱之為?second)會(huì)有一個(gè)指向父提交(first)的指針,表示?second?繼承自?first,而?master?分支則指向?second?提交。
回到?alpha?目錄,執(zhí)行?git?remote?add?beta?../beta,將?beta?倉(cāng)庫(kù)設(shè)為遠(yuǎn)程倉(cāng)庫(kù)。然后執(zhí)行?git?pull?beta?master。
在這條命令背后,它其實(shí)會(huì)執(zhí)行?git?fetch?beta?master,從?beta?倉(cāng)庫(kù)中找到?second?提交的相關(guān)對(duì)象拷貝到?alpha?倉(cāng)庫(kù);把?alpha?中關(guān)于?beta?的?master?分支記錄指向這個(gè)?second?提交;更新?FETCH_HEAD?指向剛剛從?beta?倉(cāng)庫(kù)拉取的?master?分支,還是這個(gè)?second?提交。
此外,pull?命令還會(huì)執(zhí)行?git?merge?FETCH_HEAD。從?FETCH_HEAD?得知最近拉取的分支是?beta?倉(cāng)庫(kù)的?master?分支,據(jù)此拿到相應(yīng)的對(duì)象,也就是?second?提交對(duì)象。此時(shí)?alpha?的?master?分支指著?first?提交,正好是?second?的祖先提交,于是對(duì)于?merge?命令來(lái)說(shuō)只需要將?master?分支指向?second?提交即可。接下來(lái)?merge?命令還會(huì)更新索引以匹配?second?提交的內(nèi)容,并且相應(yīng)更新工作目錄中的文件。
現(xiàn)在執(zhí)行?git?branch?red,創(chuàng)建一個(gè)名為“red”、指向?second?提交的新分支。
然后執(zhí)行?git?checkout?red。在?checkout?之前,HEAD?指向?master?分支,執(zhí)行命令之后它就指向了?red?分支,使得?red?成為當(dāng)前分支。
接下來(lái)把?number.txt?的內(nèi)容修改為?“third”,執(zhí)行?git?add?numbers.txt?和?run?git?commit?-m?third。
之后再執(zhí)行?git?push?beta?red,這條命令會(huì)把?alpha?倉(cāng)庫(kù)內(nèi)跟?third?提交相關(guān)的對(duì)象拷貝至?beta?倉(cāng)庫(kù),并且將(alpha?倉(cāng)庫(kù)內(nèi)記錄的)beta?倉(cāng)庫(kù)?red?分支指向?third?提交。就醬。