1.1Git安裝Git的最新版本可以在http://git-scm.com/下載,它是基于命令行操作的,網上也有第三方開發的相應GUI可供下載,因為我比較喜歡命令行操作,所以沒有對GUi下載和安裝,有興趣的同學可以自己試試。網上也有相應的文章和資料可以參考下微信公眾平臺和 手機號碼查詢安裝之前首先確保相應的依賴包已經安裝,主要有以下幾個:zliblibcurllibcrypto(OpenSSL)rsync(2.6.0或更高版本)這些條件滿足之后,就可以對Git進行安裝了:1.tar-xzvfgit-1.6.1.tar.gz2.cdgit-1.6.13../configure--PRefix=/usr/local4.make5.makeinstall安裝成功可以通過git--vertion查看版本。1.2項目倉庫的建立欲使用Git對現有文檔進行版本控制,首先要基于現有文檔建立項目倉庫。創建一個Git項目倉庫是很容易的,只要用命令git-init-db就可以了。$mkdirproject$cdproject$gitinittest將會作出以下的回應[git@localhostproject]$gitinitproject
InitializedemptyGitrepositoryin/home/git/project/project/.git/這樣,一個空的版本庫就創建好了,并在當前目錄中創建一個叫.git的子目錄。你可以用ls-a查看一下,并請注意其中的三項內容:
[git@localhost~]$lsproject/project/.git/
branchesconfigdescriptionHEADhooksinfoobjectsrefs
一個叫HEAD的文件,我們現在來查看一下它的內容:$cat.git/HEAD現在HEAD的內容應該是這樣:ref:refs/heads/master我們可以看到,HEAD文件中的內容其實只是包含了一個索引信息,并且,這個索引將總是指向你的項目中的當前開發分支。一個叫objects的子目錄,它包含了你的項目中的所有對象,我們不必直接地了解到這些對象內容,我們應該關心是存放在這些對象中的項目的數據。另外project目錄也不再是普通的文檔目錄了,今后我們將其稱為工作樹。因為我們主要是linux內核的開發,所以下面我舉的例子主要是對內核文件的操作,所以project目錄等同于源代碼的根目錄,亦即linux-2.6-vertex。下面應當有選擇地將工作樹中的一些文檔存儲至Git倉庫中。由于Git在向倉庫中添加文檔時并非是簡單地文檔復制過去,勢必要將所添加文檔進行一番處理,生成Git倉庫所能接受的數據格式,Git稱這個過程為"takeasnapshot("生成快照)。若將工作樹下所有文檔(包含子目錄)生成快照,可采用以下命令:$cdproject$gitadd.所生成的快照被存放到一個臨時的存儲區域,Git稱該區域為索引。使用git-commit命令可將索引提交至倉庫中,這個過程稱為提交,每一次提交都意味著版本在進行一次更新。$gitcommit執行上述git-commit命令時,Git會自動調用系統默認的文本編輯器,要求你輸入版本更新說明并保存。請記住,輸入簡約而又意義明確的版本更新說明是非常有必要的,可以幫助你快速回憶起對項目的重大改動。對于簡短的版本更新信息,可以使用git-commit的“-m”選項,如下:$gitcommit-m"你的版本更新信息"git-commit命令在后面會詳細講解。另外,在git項目倉庫建立中還要注意一下兩個問題:第一個問題是:在使用Git之前,你需要面對Git來一番自我介紹。Git不喜歡不愿透漏姓名的人,因為它要求每個人在向倉庫提交數據時,都應當承擔一定的責任。要向Git進行自我介紹,請使用以下命令:$gitconfig--globaluser.name"YourNameComesHere"$gitconfig--globaluser.emailyou@pub.admon.org第二個問題是:在生成文檔內容快照時,工作樹中有一些文檔是你不希望接受Git管理的,譬如程序編譯時生成的中間文件,對于這樣的文件如何避免為之生成快照?譬如在工作樹中存在以下子目錄:doctmpipcdriversfs其中的tmp目錄存放著文檔編譯時生成的中間文件,因此該目錄不應該被Git所管理。為解決此類問題,Git提供了文檔忽略機制,可以將工作樹中你不希望接受Git管理的文檔信息寫到同一目錄下的.gitignore文件中。對于本例中的tmp目錄,采用如下操作可將其排除倉庫之外,然后再對project生成快照即可。$cdproject$echo"tmp">.gitignore$gitadd.有關gitignore文件的諸多細節知識可閱讀其使用手冊:$mangitignore1.3項目倉庫與工作樹按照前文的說法,Git倉庫就是那個.git目錄,其中存放的是我們所提交的文檔索引內容,Git可基于文檔索引內容對其所管理的文檔進行內容追蹤,從而實現文檔的版本控制。工作樹是包含.git的目錄,在前文示例中即project目錄。為了更加明確倉庫與工作樹的概念,下面做一個實驗:$cp-Rproject/.git/tmp/test.git$cd/tmp$gitclonetest.gittest-copy首先,我們將project目錄中的.git目錄復制到/tmp目錄下并進行重命名為test.git,然后使用git-clone命令從test.git中生成test-copy目錄。若進入test-copy目錄觀察一下,就會發現該目錄所包含的內容是等同于project目錄的。上述實驗意味著,只要我們擁有倉庫,即test.git,那么就可以很容易地生成工作樹,而這個工作樹又包含著一個倉庫,即test-copy/.git。所以,我們可以這樣理解:在Git中,倉庫與工作樹之間無需分的很清楚。1.4文件操作在工作樹中,我們日常所進行的工作無非是對Git倉庫所管理的文檔進行修改,或者添加/刪除一些文件。這些操作與采用Git管理我們的文檔之前沒有任何差異,只是在你認為一個工作階段完成之時,要記得通知Git,命令它記下你所進行更新,這一步驟是通過生成文檔快照并將其加入到索引中來實現的。下面舉例說明。譬如我向project目錄添加了一個新文件fs/binfmt_hwt.c,我需要通知Git記住我的這一更新:$cdproject$gitaddfs/binfmt_hwt.c這樣,Git就會將有關fs/binfmt_hwt.c的更新添加到索引中。然后我又對其它文檔進行了一些修改,譬如修改了ipc/msg.c,繼續使用git-add命令將它們的更新添加到索引中:$gitaddipc/msg.c這里也可以使用以下命令:$git-update-index晚上,這一天的工作告以段落,我覺得有必要將今天所做的提交到倉庫中,于是執行git-commit操作,將索引內容添加到倉庫中。可能一天下來,你對工作樹中的許多文檔都進行了更新(文檔添加、修改、刪除),但是我忘記了它們的名字,此時若將所做的全部更新添加到索引中,比較輕省的做法就是:1工作樹克隆命令,在后文中將會對其詳細講述。$cdproject$gitadd.$gitcommit-a...輸入日志信息...最后這一步-a是通用的方法,我個人比較喜歡使用git-commit–m“版本信息”–a,這樣就不用對版本文件操作了。git-add命令通常能夠判斷出當前目錄(包括其子目錄)下用戶所添加的新文檔,并將其信息追加到索引中。git-commit命令的-a選項可將所有被修改的文檔或者已刪除的文檔的當前狀態提交倒倉庫中。記住,如果只是修改或者刪除了已被Git管理的文檔,是沒必要使用git-add命令的。本節并未講述新的Git命令,完全是前面所講過的一些命令的重復介紹,只是它們出現的場景有所區別而已。另外,要注意的問題是,Git不會主動記錄你對文檔進行的更新,除非你對它發號施令。1.5查看版本歷史在工作樹中,使用git-log命令可以查看當前項目的日志,也就是你在使用git-commit向倉庫提交新版本時所屬如的版本更新信息。$gitlog如果你想看一下每一次版本的大致變動情況,可使用以下命令:$gitlog--stat--summary下面分析一下git-log命令的回應信息。如下是我對內核修改后提交的幾個版本,版本標記分別為first、second、third,最下面的那個為原始版本。每一個版本都對應著一次項目版本更新提交。在項目日志信息中,每條日志的首行(就是那一串莫名奇妙的數字)為版本更新提交所進行的命名,我們可以將該命名理解為項目版本號。項目版本號應該是唯一的,默認由Git自動生成,用以標示項目的某一次更新。如果我們將項目版本號用作git-show命令的參數,即可查看該次項目版本的更新細節:$gitshow版本號(比較長我就不輸了)除了使用完整的版本號查看項目版本更新細節之外,也還可以使用以下方式:$gitshowddea091#一般只使用版本號的前幾個字符即可$gitshowHEAD#顯示當前分支的最新版本的更新細節每一個項目版本號通常都對應存在一個父版本號,也就是項目的前一次版本狀態。可使用如下命令查看當前項目版本的父版本更新細節:$gitshowHEAD^#查看HEAD的父版本更新細節$gitshowHEAD^^#查看HEAD的祖父版本更新細節$gitshowHEAD~4#查看HEAD的祖父之祖父的版本更新細節1.6撤銷與恢復版本控制系統的一個重要任務就是提供撤銷和恢復某一階段工作的功能。git-reset命令就是為這樣的任務而準備的,它可以將項目當前版本定位到之前提交的任何版本中。git-reset命令有三個選項:--mixed、--soft和--hard。我們在日常使用中僅使用前兩個選項;第三個選項由于殺傷力太大,容易損壞項目倉庫,需謹慎使用。--mixed僅是重置索引的位置,而不改變你的工作樹中的任何東西(即,文件中的所有變化都會被保留,也不標記他們為待提交狀態),并且提示什么內容還沒有被更新了。這個是默認的選項。--soft既不觸動索引的位置,也不改變工作樹中的任何內容,我們只是要求這些內容成為一份好的內容(之后才成為真正的提交內容)。這個選項使你可以將已經提交的東西重新逆轉至“已更新但未提交(UpdatedbutnotCheckin)”的狀態。就像已經執行過git-update-index命令,但是還沒有執行git-commit命令一樣。--hard將工作樹中的內容和頭索引都切換至指定的版本位置中,也就是說自<commit-ish>之后的所有的跟蹤內容和工作樹中的內容都會全部丟失。因此,這個選項要慎用,除非你已經非常確定你的確不想再看到那些東西了。關于git-reset命令的具體如何使用可留作本章的練習題,你可以隨便創建一個Git倉庫并向其提交一些版本更新,然后測試--mixed與--soft選項的效果。如果欲查看git-reset命令對工作樹的影響,可使用git-status命令。這是我們工作中的重點和難點!1.7Git命令詳解分支管理:git-branch直至現在為止,我們的項目版本庫一直都是只有一個分支master。在git版本庫中創建分支的成本幾乎為零,所以不必吝嗇多創建幾個分支。下面列舉一些常見的分支策略,僅供大家參考:創建一個屬于自己的個人工作分支,以避免對主分支master造成太多的干擾,也方便與他人交流協作。當進行高風險的工作時,創建一個試驗性的分支,扔掉一個爛攤子總比收拾一個爛攤子好得多。合并別人的工作的時候,最好是創建一個臨時的分支,關于如何用臨時分支合并別人的工作的技巧,將會在后面講述。創建分支下面的命令將創建我自己的工作分支,名叫litary,并且將以后的工作轉移到這個分支上開展。$git-branchlitary$git-checkoutlitary刪除分支要刪除版本庫中的某個分支,使用git-branch-D命令就可以了,例如:$git-branch-Dbranch-name查看分支運行下面的命令可以得到你當前工作目錄的分支列表:$git-branch輸出的分支中前面帶*的就是你現在所在的分支,如果你忘記了你現在工作在哪個分支上,可以這樣查看,而且運行下面的命令也可以告訴你:$cat.git/HEAD查看項目的發展變化和比較差異這一節介紹幾個查看項目的版本庫的發展變化以及比較差異的很有用的命令:git-show-branchgit-diffgit-whatchangedgit-show-branch命令可以使我們看到版本庫中每個分支的世系發展狀態,并且可以看到每次提交的內容是否已進入每個分支。讓我們看到版本庫的發展記錄。譬如我們要查看世系標號為master^和litary的版本的差異情況,我們可以使用這樣的命令:$git-diffmaster^litary合并兩個分支:git-merge既然我們為項目創建了不同的分支,那么我們就要經常地將自己或者是別人在一個分支上的工作合并到其他的分支上去。現在我們看看怎么將litary分支上的工作合并到master分支中。現在轉移我們當前的工作分支到master,并且將litary分支上的工作合并進來。$git-checkoutmaster$git-merge"Mergeworkinlitary"HEADlitary合并兩個分支,還有一個更簡便的方式,下面的命令和上面的命令是等價的。$git-checkoutmaster$git-pull.litary但是,此時git會出現合并沖突提示,就要根據具體的情況和需求對它修改。可以參考下防騙吧,他們網站的開發也是使用了git的版本控制器
新聞熱點
疑難解答