0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教你20分鐘搞懂Git!

電子工程師 ? 來源:lq ? 2018-12-12 09:48 ? 次閱讀

Git 是最流行的版本管理工具,也是程序員必備的技能之一。本文就來教你20 分鐘搞懂 Git!

以下為譯文:

盡管每天你都會用到Git,但也有可能搞不懂它的工作原理。為什么Git可以管理版本?基本命令git add和git commit到底在干什么?

在這篇文章中,我將用一個例子來解釋Git的運行過程,幫助你理解Git的工作原理。

初始化

讓我們創(chuàng)建一個項目的目錄,然后進入該目錄。

$mkdirgit-demo-project$cdgit-demo-project

如果想管理項目的版本,那么我們應(yīng)該做的第一件事情就是通過git init初始化。

$gitinit

git init只做了一件事情,那就是在項目的根目錄下創(chuàng)建.git子目錄來保存版本信息。

$ls.gitbranches/configdescriptionHEADhooks/info/objects/refs/

上述命令顯示了.git子目錄中的內(nèi)容。

保存對象

接下來讓我們創(chuàng)建一個新的空文件test.txt。

$touchtest.txt

然后把這個文件添加到Git代碼庫中,這一步將創(chuàng)建test.txt現(xiàn)有內(nèi)容的一個副本。

$githash-object-wtest.txte69de29bb2d1d6434b8b29ae775ad8c2e48c5391

在上述代碼中,git hash-object命令將test.txt現(xiàn)有的內(nèi)容壓縮成二進制文件,并保存到Git中。該壓縮文件叫做Git對象,保存在.git/objects目錄中。

我們可以通過這個命令根據(jù)對象的文件名獲取當(dāng)前內(nèi)容,并計算成SHA1 哈希(長度為40的字符串)。讓我們看看下列新生成的Git對象文件。

$ls-R.git/objects.git/objects/e6:9de29bb2d1d6434b8b29ae775ad8c2e48c5391

如上述代碼所示,.git/objects目錄下又多出了一個子目錄,而且這個子目錄名是上述哈希值的前兩個字符。在這個子目錄下有一個文件,文件名是上述哈希值中其余的38個字符。

讓我們再來看看文件內(nèi)容。

$cat.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

上述代碼輸出的文件內(nèi)容是一些二進制字符。你可能會問既然test.txt是空文件,又怎么會有這些內(nèi)容呢?這是因為該二進制對象中還存儲了一些元數(shù)據(jù)。

如果你想看看該文件原始的文本內(nèi)容,那么應(yīng)該使用git cat-file。

$gitcat-file-pe69de29bb2d1d6434b8b29ae775ad8c2e48c5391

因為原文件為空,所以上述命令什么都沒有顯示?,F(xiàn)在我們往test.txt文件中寫點東西。

$echo'helloworld'>test.txt

這個文件的內(nèi)容已經(jīng)改變了,所以你需要再次把它保存為Git對象。

$githash-object-wtest.txt3b18e512dba79e4c8300dd08aeb37f8e728b8dad

如上述代碼所示,test.txt的哈希值已經(jīng)隨著文件內(nèi)容的改變而發(fā)生了變化。同時還生成了新文件.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad?,F(xiàn)在你可以看到這個文件的內(nèi)容了。

$gitcat-file-p3b18e512dba79e4c8300dd08aeb37f8e728b8dadhelloworld

更新索引

當(dāng)文件保存成二進制對象以后,你需要告訴Git哪個文件發(fā)生了變化。Git會在一個名叫“索引”(或階段)的區(qū)域記錄所有發(fā)生了變化的文件。然后等到所有的變更都結(jié)束后,將索引中的這些文件一起寫入正式的版本歷史記錄中。

$gitupdate-index--add--cacheinfo1006443b18e512dba79e4c8300dd08aeb37f8e728b8dadtest.txt

上述命令記錄了文件名test.txt、二進制對象名(哈希值)以及索引中文件的訪問權(quán)限。

git ls-files命令可以顯示索引中當(dāng)前的內(nèi)容。

$gitls-files--stage1006443b18e512dba79e4c8300dd08aeb37f8e728b8dad0test.txt

上述代碼顯示索引中只有一個test.txt文件,還顯示了該文件的二進制對象名和訪問該文件的權(quán)限。如果你知道該二進制對象名,就可以查看.git/objects子目錄中該文件的內(nèi)容。

git status命令可以輸出更多可讀的結(jié)果。

$gitstatusChangestosubmit:Thenewfile:test.txt

上述代碼顯示索引中只有一個新文件test.txt,該文件正在等候?qū)懭氚姹镜臍v史記錄中。

git add命令

針對每個文件執(zhí)行上述兩個步驟非常繁瑣。所以Git提供了git add命令來簡化這些操作。

$gitadd--all

上述命令相當(dāng)于針對當(dāng)前項目中所有發(fā)生了變化的文件執(zhí)行上述兩個步驟。

提交(Commit)

索引保存發(fā)生了變化的文件信息。等到修改完成,所有這些信息都會被寫入版本的歷史記錄中,這相當(dāng)于生成一個當(dāng)前項目的快照。

項目的歷史記錄由不同時間點的項目快照組成。Git可以將項目恢復(fù)成任何一個快照。在Git中“快照”有一個專門的術(shù)語,即“提交”(commit)。所以生成快照也可以稱之為完成提交。

下列所有“快照”的引用指的都是提交。

完成提交

首先,我們需要設(shè)置用戶名和郵件地址。在你保存快照的時候,Git需要記錄是誰執(zhí)行的提交。

$gitconfiguser.name"username"$gitconfiguser.email"Emailaddress"

接下來,保存現(xiàn)有的目錄結(jié)構(gòu)。在本文的前面我們討論了保存對象只會保存一個文件,并不會記錄文件之間的目錄結(jié)構(gòu)。

git write-tree命令可以根據(jù)當(dāng)前目錄結(jié)構(gòu)生成一個Git對象。

$gitwrite-treec3b8bb102afeca86037d5b5dd89ceeb0090eae9d

在上述代碼中,目錄結(jié)構(gòu)保存成了二進制對象,而對象的名字是哈希值。它也保存在.git/objects目錄中。

讓我們來看看該文件的內(nèi)容。

$gitcat-file-pc3b8bb102afeca86037d5b5dd89ceeb0090eae9d100644blob3b18e512dba79e4c8300dd08aeb37f8e728b8dadtest.txt

可以看到,當(dāng)前目錄中只有一個文件test.txt。

這個所謂的快照就是保存當(dāng)前的目錄結(jié)構(gòu),以及每個文件相對應(yīng)的二進制對象。之前的操作已經(jīng)保存了文件結(jié)構(gòu),所以現(xiàn)在你需要把這個目錄結(jié)構(gòu)和一些元數(shù)據(jù)一起寫入版本的歷史記錄中。

git commit-tree可以將目錄樹對象寫入到版本的歷史記錄中。

$echo"firstcommit"|gitcommit-treec3b8bb102afeca86037d5b5dd89ceeb0090eae9dc9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

在上述代碼中,在提交時你需要提供提交的描述,而且你可以通過echo "first commit"提供提交描述。git commit-tree命令會根據(jù)元數(shù)據(jù)以及目錄樹生成一個Git對象?,F(xiàn)在,讓我們來看看該對象的內(nèi)容。

$gitcat-file-pc9053865e9dff393fd2f7a92a18f9bd7f2caa7fatreec3b8bb102afeca86037d5b5dd89ceeb0090eae9dauthorjam1538889134+0800committerjam1538889134+0800firstcommit

在上述代碼中,第一行輸出是對應(yīng)于該快照的目錄樹對象,而第二行和第三行是有關(guān)作者和提交者的信息,最后一行內(nèi)容是提交的描述。

通過git log命令我們還可以查看某個快照的信息。

$gitlog--statc9053865e9dff393fd2f7a92a18f9bd7f2caa7facommitc9053865e9dff393fd2f7a92a18f9bd7f2caa7faAuthor:jamDate:SunOct713:12:142018+0800firstcommittest.txt|1+1filechanged,1insertion(+)

git commit命令

Git提供了git commit來簡化上述提交操作。在保存到索引后,你只需要執(zhí)行g(shù)it commit命令,就可以同時提交目錄結(jié)構(gòu)和描述,并生成快照。

$gitcommit-m"firstcommit"

另外,還有兩個命令也非常實用。

通過git checkout命令,我們可以切換到某個快照。

$gitcheckoutc9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

通過git show命令,我們可以顯示某個快照的所有代碼變更。

$gitshowc9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

分支(branch)

然而,如果你使用git log命令來查看整個版本的歷史記錄時,卻無法看到剛剛生成的快照。

$gitlog

上述命令輸出為空。這是為什么?這個快照剛剛不是寫入到歷史記錄中了嗎?

真相是:git log命令只可以顯示當(dāng)前分支上的變化。盡管我們已經(jīng)提交了這個快照,但是還沒有記錄這個快照屬于哪個分支。

分支是快照的指針,分支的名字就是該指針的名字。雖然哈希值不可讀,但是分支允許用戶給快照起別名。另外,分支還會自動更新,如果當(dāng)前分支是一個新的快照,那么這個指針會自動指向它。例如,主分支(master branch)有一個名為master的指針指向主分支當(dāng)前的快照。

用戶可以為任何快照創(chuàng)建新指針。例如,如果你想創(chuàng)建一個新的fix-typo分支,那么只需創(chuàng)建一個名為fix-typo的指針,并指向一個快照。因此,在Git中創(chuàng)建一個新分支非常容易,而且開銷非常低。

Git有一個特殊的指針HEAD,它始終指向當(dāng)前分支中最新的那個快照。另外,Git還提供了快捷方式。例如,HEAD^指向HEAD之前的快照(父節(jié)點),而HEAD~6指向HEAD之前的第六個快照。

每個分支的指針都是一個文本文件,存儲在.git/refs/heads/目錄中。文件的內(nèi)容是它指向的快照的二進制文件名(哈希值)。

更新分支

下面我們將演示如何更新分支。首先,修改test.txt。

$echo"helloworldagain">test.txt

然后保存二進制對象。

$githash-object-wtest.txtc90c5155ccd6661aed956510f5bd57828eec9ddb

接下來,將該對象寫入索引,并保存目錄結(jié)構(gòu)。

$gitupdate-indextest.txt$gitwrite-tree1552fd52bc14497c11313aa91547255c95728f37

最后,提交目錄結(jié)構(gòu),并生成一個快照。

$echo"secondcommit"|gitcommit-tree1552fd52bc14497c11313aa91547255c95728f37-pc9053865e9dff393fd2f7a92a18f9bd7f2caa7fa785f188674ef3c6ddc5b516307884e1d551f53ca

在上述代碼中,我們可以通過git commit-tree命令的參數(shù)-p來指定父節(jié)點,即以哪個快照為基礎(chǔ)。

下面我們把快照的哈希值寫入到.git/refs/heads/master文件中,并讓master指針指向該快照。

$echo785f188674ef3c6ddc5b516307884e1d551f53ca>.git/refs/heads/master

現(xiàn)在,通過git log命令你可以看到兩個快照了。

$gitlogcommit785f188674ef3c6ddc5b516307884e1d551f53ca(HEAD->master)Author:jamDate:SunOct713:38:002018+0800secondcommitcommitc9053865e9dff393fd2f7a92a18f9bd7f2caa7faAuthor:jamDate:SunOct713:12:142018+0800firstcommit

git log命令的運行過程大致如下:

找到HEAD指針對應(yīng)的分支。在上述示例中為master。

找到master指針指向的快照。在上述示例中為785f188674ef3c6ddc5b516307884e1d551f53ca。

找到父節(jié)點(即前一個快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa。

等等,最后顯示當(dāng)前分支中所有的快照。

另外,上述我們曾提到分支指針是動態(tài)的,下述三個命令會自動覆蓋分支指針。

Git commit:當(dāng)前分支的指針將移動到新創(chuàng)建的快照上。

Git pull:在當(dāng)前分支和遠程分支合并后,指針會指向新創(chuàng)建的快照。

Git reset [commit_sha]:當(dāng)前分支的指針將被復(fù)位到某個指定的快照上。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 二進制
    +關(guān)注

    關(guān)注

    2

    文章

    772

    瀏覽量

    41542
  • Git
    Git
    +關(guān)注

    關(guān)注

    0

    文章

    195

    瀏覽量

    15713

原文標題:20分鐘教你搞懂Git!

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    40分鐘教你學(xué)會什么是ARM架構(gòu)

    門老大Chris Shore 做了一個最短小精悍的視頻,用40分鐘教會大家到底什么是ARM架構(gòu),并且ARM公司的Video Team團隊幫忙制作了中文字幕,方便大家學(xué)習(xí)觀看。請大家看這里:
    發(fā)表于 10-14 16:07

    電腦用到不到20分鐘后就黑屏

    各位大神我的電腦用不到20分鐘就黑屏,后在開機又能用個20分鐘這樣就又黑屏了,華碩的
    發(fā)表于 07-19 09:03

    3分鐘教你使用STM32CubeMX配置工程并移植機智云生成的協(xié)議

    3分鐘教你使用STM32CubeMX配置工程并移植機智云生成的協(xié)議
    發(fā)表于 09-29 15:13

    分鐘搞懂PID控制算法

    【Arduino 101】五分鐘搞懂PID控制算法物料清單尺寸接線文章目錄物料清單尺寸接線物料清單Arduino Uno x 1超聲波模塊(HC-SR04)x 1舵機(Tower Pro
    發(fā)表于 06-28 07:53

    20分鐘建立一個NIOSII開發(fā)環(huán)境

    20分鐘建立一個NIOSII開發(fā)環(huán)境
    發(fā)表于 08-03 09:52 ?26次下載
    <b class='flag-5'>20</b><b class='flag-5'>分鐘</b>建立一個NIOSII開發(fā)環(huán)境

    200余人投訴聯(lián)想筆記本電池:保修期后僅用20分鐘

    聯(lián)想筆記本電池被200余人投訴:保修期后僅用20分鐘 2009年11月14日8:23:53 近日
    發(fā)表于 11-14 08:24 ?1293次閱讀

    神級快充榮耀Magic:30分鐘92%的充電速率堪稱黑科技!

    潘九堂表示,開機狀態(tài)下,榮耀Magic充電5分鐘19%,10分鐘39%,20分鐘73%,30分鐘92%。關(guān)機狀態(tài)下,榮耀Magic能實現(xiàn)5
    發(fā)表于 12-22 15:15 ?1702次閱讀

    汽車可利用AI在20分鐘內(nèi)學(xué)會自動駕駛

    英國的一個研究小組在20分鐘內(nèi)“教會”一輛自動駕駛汽車在車道上自動行駛,人可能還無法在短時間內(nèi)學(xué)會開車。
    的頭像 發(fā)表于 07-12 11:15 ?3826次閱讀

    Git是什么?Git的基本使用資料說明

      Git是什么? Git是目前世界上最先進的分布式版本控制系統(tǒng)(沒有之一)。
    發(fā)表于 05-29 17:56 ?1次下載
    <b class='flag-5'>Git</b>是什么?<b class='flag-5'>Git</b>的基本使用資料說明

    Microvast開發(fā)適用于多種車型的軟包電池,可在20分鐘充滿電

    據(jù)外媒報道,Microvast Europe公司發(fā)布一款新電池,適用于乘用車、商用車和火車等各種車型,可在20分鐘內(nèi)從零充電至100%。
    發(fā)表于 10-21 11:47 ?1206次閱讀

    為什么說Git把SVN拍在沙灘上了呢?

    不同的體驗。 一、Git是分布式的,SVN是集中式的 這是 Git 和 SVN 最大的區(qū)別。若能掌握這個概念,兩者區(qū)別基本搞懂大半。因為 Git 是分布式的,所以
    的頭像 發(fā)表于 04-30 11:57 ?1452次閱讀
    為什么說<b class='flag-5'>Git</b>把SVN拍在沙灘上了呢?

    2分鐘快速教你如何在華為模擬器ensp上進行抓包?

    2分鐘快速教你如何在華為模擬器ensp上進行抓包?
    的頭像 發(fā)表于 12-05 11:25 ?4286次閱讀

    【硬核科普】3分鐘帶你搞懂PCB壓合工藝

    銅免費檢測:登錄華秋電路官網(wǎng)>進入用戶中心>點擊孔銅檢測>一鍵申請。點擊孔銅檢測0元PCB打樣原文標題:【硬核科普】3分鐘帶你搞懂PCB壓合工藝文章出處:【微信公
    的頭像 發(fā)表于 08-12 09:31 ?1328次閱讀
    【硬核科普】3<b class='flag-5'>分鐘</b>帶你<b class='flag-5'>搞懂</b>PCB壓合工藝

    Git是什么 Git介紹

    git 是什么? Git 誕生于 2005 年,是一款免費、開源、分布式版本控制系統(tǒng)。 直接記錄快照,而非差異比較 Git 和其它版本控制系統(tǒng)的主要差別在于 Git 對待數(shù)據(jù)的方式。
    的頭像 發(fā)表于 07-22 10:50 ?1711次閱讀
    <b class='flag-5'>Git</b>是什么 <b class='flag-5'>Git</b>介紹

    一文搞懂版本控制與Git

    在這個碼代碼的時代,我們越來越離不開版本控制工具。而在眾多版本控制工具中,Git無疑是最為強大和流行的。
    的頭像 發(fā)表于 10-20 09:46 ?404次閱讀
    一文<b class='flag-5'>搞懂</b>版本控制與<b class='flag-5'>Git</b>