git使用手冊


一、說明

  鑒於目前使用git的公司越來越多,而筆者之前一直使用SVN,對於使用svn進行項目管理比較熟悉,但是對於git,網絡上搜尋的各種資源雖然很多,但是雜亂而且很少有對於完全不懂的小白進行講解的部分。

  因此筆者通過朋友搜集了部分git相關的電子書籍,以及結合一些網絡博客,在此文進行一個匯總,同時也算是對於自身學習的一種總結。

二、什么是git

1、版本控制工具。

  版本控制用於記錄若干文件的內容變化,以便於將來查詢某一特定時間點文件的當前內容。例如原本穩定運行的項目需要新增某種新的功能,新功能完成上線后在實際情況中並不如何實用並且帶來不可預知的問題,因此需要對該功能進行刪除,此時,可以使用版本控制工具,對項目進行版本還原,還原到之前未添加新功能時候的項目內容。在git中,該文件可以是任意類型。

2、集中化的版本控制系統。

  在版本控制工具最開始的時候,考慮的問題是如何解決多人同時開發一個項目而進行的協同工作的問題。該類型的版本控制工具也稱為集中化的版本控制系統(CVCS)。

          

 

  CVCS采用的做法是提供一個集中管理的服務器,保存所有文件的修訂版本,而參與開發的開發人員通過客戶端連接這台服務器,取出最新的文件或者提交更新。

3、分布式版本控制系統。

  與集中化的版本控制系統所不同的是, 分布式版本控制系統的每一個客戶端都保存了當前倉庫的所有版本內容(包括歷史版本記錄),而不僅僅只是一個當前版本的內容。這樣的好處在於避免當唯一的服務器宕機時出現的之前版本記錄丟失的問題。這樣每一個客戶端都相當於一個服務器,都可以對倉庫進行恢復,更加保證了項目的安全性。

  

4、git是一種分布式版本控制系統。

從誕生初期,它便被設定了如下目標:

  • 速度
  • 簡單的設計
  • 對非線性開發模式的強力支持(允許上千個並行開發的分支)
  • 完全分布式
  • 有能力高效管理超大規模項目

5、git與其他版本控制系統的對比。

  

  大多數的其他版本控制系統側重點在於所提交的某個或多個文件內容的具體差異(如左圖),而git側重點在於對文件整體的變化(右圖中)。其他版本控制系統只會記錄更新文件的具體修改細節,而git則是對於整個文件與倉庫中保存的原文件進行對比,如果不同,則保存新的文件,如果相同,則引入它的索引,作為一個新的版本記錄下來。

6、git近乎所有操作均可本地執行。

  與筆者所使用的SVN每次進行更新或提交都需要保證網絡能連通服務端所不同的是,由於git已經將所有的版本信息保存在了本地,因此不論是提交、更新或者還原操作,均可以在沒有網絡的情況下進行,等到能與服務端連接的時候,再對所更新的內容提交到服務端保存。

7、時刻保持數據完整性。

  在保存到git之前,所有的數據都要進行內容的校驗和計算,並將此結果作為數據的唯一標識和索引。

  git使用的是SHA-1算法計算數據的校驗和,通過對文件的內容或目錄的結構計算出一個SHA-1哈希值,作為指紋字符串。該字符串由四十位十六進制數組成。保存在git中的所有文件實際上都是以該哈希值做索引,而不是文件名。

8、git的三種狀態。

  在git內容有且僅有三種狀態:

  • 已提交(committed):該文件已被安全地保存在本地數據庫。
  • 已修改(modified):已修改了某個文件,尚未提交保存。
  • 已暫存(staged):把已修改的文件,放在下次提交時要保存的清單中。

  由此,我們可以看到git管理項目,文件流轉的三個工作區域:git本地數據目錄、工作目錄、暫存目錄

  

  每一個項目都有一個git目錄(git directory),它是git用來保存元數據和對象數據庫的地方,每次拷貝鏡像倉庫時,實際拷貝的就是這個目錄里的數據。

  從項目中取出某個版本的所有文件和目錄,用以開始后續工作的叫做工作目錄(working directory)。

  暫存區域(staging area)只不過是個簡單文件,通常放在git目錄中。有時候還被稱為索引文件。

9、基本git的工作流程。

  1. 在工作目錄中修改某些文件。
  2. 對這些修改的文章做快照,並保存在暫存區域。
  3. 提交更新,將保存在暫存區域的文件保存到git目錄中。

三、安裝並配置git

1、安裝git。

linux:

  fedora:$ yum instal; git-core

  Ubuntu:$ apt-get instal; git-core

windows:

  從地址http://code.google.com/p/msysgit下載msysGit項目所提供的安裝包(.exe)。

2、git的配置工具。

git提供了一個叫做git config的工具(實際是git-config的命令,只不過可以通過git加一個名字來呼叫此命令。),專用用來配置或讀取相應的工作環境變量,這些環境變量存放在以下三個目錄:

  • /etc/gitconfig文件:系統中對所有用戶都適用的配置,使用--system選項配置該文件。
  • ~/.gitconfig文件:用戶目錄下的配置文件只適用於該用戶,使用--global選項配置該文件。
  • 當前項目的.git目錄中的配置文件(工作目錄下的./git/config文件):配置僅針對當前的項目。 

每一級的配置都會取代更上一級的相同配置, 例如當前項目的.git/config文件中進行過配置,則在~/gitconfig文件中所配置的則會無效。

3、配置用戶名稱和電子郵箱。

$ git config --global user.name "yxf"

$ git config --global user.email 5277xxxx@qq.com

配置成功后,每一次提交項目去git中,均會引用這兩條信息,以標識是誰提交的更新。

4、配置文本編輯器。

默認情況下,git會使用操作系統指定的默認編輯器,一般是vi或vim。但可以通過指令來進行重新設定:

使用Emacs編輯器:$ git config --global core.editor emacs。

5、配置差異分析工具。

解決合並沖突時,改用常使用的vimdiff作差異分析工具:$ git config --global merge.tool vimdiff

 6、查看配置信息。

$ git config --list

有時候會查詢出相同的變量名,這種情況是由於它們來自不同的配置文件,但實際有效(被git所采用)的是最后一個。

也可以直接查詢某個環境變量名,只需把特定的變量名加在參數后面即可:$ git config user.name

7、獲取幫助。

有三種方式可以使用幫助:

  • $ git help <verb>
  • $ git <verb> --help
  • $ man git-<verb>

比如要學習config命令如何使用:$ git help config

四、git基礎

1、取得git倉庫

有兩種取得git倉庫的辦法:

  • 在現存目錄下,通過導入所有文件來創建新的git倉庫。
  • 從已有git倉庫克隆一個新的鏡像倉庫。

(1)創建新的git倉庫步驟:

找到項目所在目錄,執行$ git init,將在當前目錄下生成一個新的.git目錄,所有git所需要的數據和資源都存放在這個目錄中。

如果當前目錄下有幾個文件需要被納入版本控制,需要使用$ git add告訴git對這些文件進行跟蹤,如$ git add README.txt,如果后面一個參數是目錄,則表示當前目錄下所有文件都需要被添加。全部文件被放入暫存區域后,執行提交命令$ git commit -m 'initial project version'.

(2)從現有倉庫克隆:

如果已經知道一個遠程git倉庫的地址,可以使用git clone命令。與其他版本控制系統使用checkout不同的是,git是復制包括了歷史版本的所有版本,因此使用的是clone。例如遠程git倉庫地址為git://github.com/schacon/grit.git,使用命令如下:$ git clone git://github.com/schacon/grit.git。

執行完之后,會在當前目錄中出現一個名為grit的目錄,並且將倉庫中最新的文件全部拷貝在該目錄下。如果想要克隆時指定自己的目錄,則需要在命令行后面添加想要的目錄名即可,如:$ git clone git://github.com/schacon/grit.git mygrit。

在以上例子中,git數據傳輸使用的地址為git://協議,同樣的還可以使用http(s)://等SSH傳輸協議。

2、文件狀態

工作目錄下的文件都只有兩種狀態:已跟蹤和未跟蹤。已跟蹤文件指的是已經被納入版本控制的文件,它們可能是未更新、已修改或者已放入暫存區。而其他文件則全部是未跟蹤文件,指的是未被納入版本控制的文件。初次從遠程倉庫中克隆到工作目錄的文件都屬於已跟蹤未修改,經過某些編輯后,變為已跟蹤已修改,然后將它們放入暫存區域,等待最后一次性提交暫存區域里所有的文件。具體變化周期如下圖

如果想要查看當前目錄下的文件處於什么狀態,可以執行命令$ git status,結果如下圖:

git會清楚地告訴我們哪些文件做了修改已放入暫存,哪些文件做了修改未放入暫存,哪些文件未追蹤等等。同時如果我們修改了一個文件,並執行$ git add將它放入暫存區域后,又再度對它進行修改,此時查詢狀態該文件將同時出現在"Changes to be committed"和"Changes not staged for commit"中。但需要注意的是,這兩個地方的同一份文件代表的分別是不同的版本,此時執行$ git commit提交是的上一次add時的代碼,而新修改的記錄仍然顯示未放入暫存區域。

3、忽略某些文件

對於項目日志和ide自動生成的某些文件,我們不想要將它們納入版本控制,同時也不希望每次出現在未跟蹤文件列表,因此我們可以創建一個.gitignore的文件,列出要忽略的文件模式。

首先需要執行命令$ touch .gitignore(有些是$ cat .gitignore),在當前目錄下生成.gitignore文件。

然后在.gitignore文件中列出要忽略的文件模式。.gitignore格式規范如下:

  • 所有空行或以注釋符號"#"開頭的行都會被git忽略。
  • 可以使用標准的glob模式匹配。
  • 匹配模式最后跟反斜杠(/)說明要忽略的是目錄。
  • 要忽略除指定模式以外的所有文件,可以在模式前使用"!"取反。

所謂的glob模式為shell使用的簡化了的正則表達式。星號("*")匹配零個或任意多個字符;[abc]匹配任何一個列在方括號中的字符;問號(?)只匹配任意一個字符;[0-9]匹配0到9之間的所有數據。如下圖,表示忽略目錄中的.classpath和.project文件

4、查詢已暫存與未暫存的更新

假如我們的文件在存入暫存區后又進行修改但未再存入暫存區域,可以使用命令$ git diff查看當前未暫存區域與暫存區域內容的不同。

如果文件已經被放入暫存區域,則使用命令$ git --cache(在git1.6及以上的版本中還允許使用$ git --staged),可以查看當前暫存區域版本與上一次提交版本的不同。

有時候使用命令$ git diff會無法執行其他命令,需要按鍵"q"重新退回。

5、提交更新

提交命令是$ git commit。通常在執行該命令之前,都需要先執行$ git status查看是否所有修改文件都已經放入暫存區域。

但是如果只輸入提交命令,會進入文本編輯模式,讓你輸入本次提交的說明。

輸入更新說明后,按"Esc"鍵,然后輸入":wq",再按回車鍵,將進行保存並退出,然后提示提交成功。

或者在命令后面添加-m,如:$ git commit -m "first test"。git會將"firsr test"作為更新說明保存並提交。

同時,如果想跳過存儲區直接將所有已修改文件更新,可以直接使用命令$ git commit -a -m "commit all"將所有的文件,包括放入存儲區域的和未放入存儲區域的,全部提交。

6、移除文件

移除文件分為兩種情況,一是直接刪除本地文件,二是將文件移出git的版本控制。

刪除本地文件,再執行$ git status時會提示已修改但未放入存儲區域,需要先執行add,再執行commit。

移出git的版本控制,需要使用命令$ git rm <file>,再執行$ git status時會提示已放入存儲,但未提交,此時的該文件已經被從目錄中刪除,只需要再度執行commit即可。

如果僅想要將該文件移出git的版本控制,但不從目錄中刪除,需要在rm后添加參數--cache,如$ git rm --cache README.txt

7、移動文件

git並不會如同其他VCS系統,並不跟蹤文件移動操作,也不會體現改名操作。

如果想要在git中修改文件名,需要使用命令$ git mv file_old file_new。此時,我們已經將修改放入了暫存區,只需等待提交。

但是在實際的git操作中,它相當於替我們執行了三條命令,$ git mv file_old file_new,$ git rm file_old,$ git add file_new。

8、查詢提交歷史

$ git log

默認不帶參數的查詢,會按從新到舊的順序列出所有的更新,每一條更新記錄后會有一條SHA-1的校驗碼,作者、電子郵箱和提交時間,最后縮進一個段落顯示幫助說明。

參數-p,顯示每次提交的內容差異

參數-<n>,顯示最近的n次更新

以及一些常用的參數如下:

參數之間可以搭配使用,例如$ git log -p -2,即為查詢最近的兩次更新並顯示內容差異。

除了以上在git中使用log命令外,還可以通過圖形化工具gitk中進行歷史版本查詢。

9、撤銷操作

撤銷分為幾種情況:修改最后一次提交,已暫存的撤銷,取消對文件的修改(文件還原)。

修改最后一次提交:$ git --amend。此命令用在已經提交一次之后,發現提交文件存在問題,或者是遺留未提交的文件,此時將需要修改的文件重新add入存儲區,再執行$ git --amend即可。如果想要修改提交說明,在存儲區中沒有新的文件時執行該命令,會有機會重新編輯提交說明,編輯后保存,即會覆蓋上一次的內容。不論是哪一種,都會被作為一次提交處理。git log中也只會有修改后的記錄。

取消已暫存的文件:$ git reset HEAD <file>。此命令會將已經執行add添加入暫存區域的文件重新移出。

取消對文件的修改:$ git checkout -- <file>

10、遠程倉庫的使用

查看當前目錄下的遠程倉庫:$ git remote -v(不加-v只顯示遠程倉庫名字,加-v后同時顯示遠程倉庫地址)。遠程倉庫的默認命名為origin

添加一個新的遠程倉庫:$ git remote add [shortname] [url]。之后可以使用shortname指代該遠程倉庫,同時目前盡只是添加遠程倉庫,還需要執行$ git fetch [shortname]將遠程倉庫上的文件拷貝到本地。

從遠程倉庫獲取更新:$ git fetch [remote-name]。需要注意的是,該命令只是將遠程倉庫的數據拉到本地倉庫,但並不自動合並到工作分支中。

如果設置了某個分支用於跟蹤遠程倉庫的分支,可以使用$ git pull命令自動抓去數據下來,並自動合並到工作目錄。實際上,使用$ git clone命令克隆的遠程倉庫就是跟蹤了分支,可以直接使用$ git pull跟新到本地工作目錄。

推送更新去遠程倉庫:$ git push [remote-name] [brance-name]。如果是clone下來的分支,可以使用默認的名稱$ git push origin master。

查看遠程倉庫信息:$ git remote show [remote-name]

遠程倉庫的重命名:$ git remote rename [old_name] [new_name]重命名后的本地分支名同樣也會跟着變化。

遠程倉庫的刪除:$ git remote rm [remote-name]

《git理解完全手冊.zh》P35未完待續......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM