要對現有的某個項目開始用 Git 管理,只需到此項目所在的目錄,執行:git
$ git init
若是當前目錄下有幾個文件想要歸入版本控制,須要先用 git add
命令告訴 Git 開始對這些文件進行跟蹤,而後提交:github
$ git add *.c $ git add README $ git commit -m 'initial project version'
若是想對某個開源項目出一份力,能夠先把該項目的 Git 倉庫複製一份出來,這就須要用到 git clone
命令。若是你熟悉其餘的 VCS 好比 Subversion,你可能已經注意到這裏使用的是 clone
而不是checkout
。這是個很是重要的差異,Git 收取的是項目歷史的全部數據(每個文件的每個版本),服務器上有的數據克隆以後本地也都有了。實際上,即使服務器的磁盤發生故障,用任何一個克隆出來的客戶端均可以重建服務器上的倉庫,回到當初克隆時的狀態(雖然可能會丟失某些服務器端的掛鉤設置,但全部版本的數據仍舊還在,有關細節請參考第四章)。正則表達式
克隆倉庫的命令格式爲 git clone [url]
。好比,要克隆 Ruby 語言的 Git 代碼倉庫 Grit,能夠用下面的命令:shell
$ git clone git://github.com/schacon/grit.git
這會在當前目錄下建立一個名爲grit
的目錄,其中包含一個 .git
的目錄,用於保存下載下來的全部版本記錄,而後從中取出最新版本的文件拷貝。若是進入這個新建的 grit
目錄,你會看到項目中的全部文件已經在裏邊了,準備好後續的開發和使用。若是但願在克隆的時候,本身定義要新建的項目目錄名稱,能夠在上面的命令末尾指定新的名字:服務器
$ git clone git://github.com/schacon/grit.git mygrit
惟一的差異就是,如今新建的目錄成了 mygrit
,其餘的都和上邊的同樣。ui
Git 支持許多數據傳輸協議。以前的例子使用的是 git://
協議,不過你也能夠用 http(s)://
或者user@server :/path.git
表示的 SSH 傳輸協議。咱們會在第四章詳細介紹全部這些協議在服務器端該如何配置使用,以及各類方式之間的利弊。url
使用命令 git add
開始跟蹤一個新文件。因此,要跟蹤 README 文件,運行:spa
$ git add README
通常咱們總會有些文件無需歸入 Git 的管理,也不但願它們總出如今未跟蹤文件列表。一般都是些自動生成的文件,好比日誌文件,或者編譯過程當中建立的臨時文件等。咱們能夠建立一個名爲 .gitignore
的文件,列出要忽略的文件模式。來看一個實際的例子:.net
$ cat .gitignore *.[oa] *~
第一行告訴 Git 忽略全部以 .o
或 .a
結尾的文件。通常這類對象文件和存檔文件都是編譯過程當中出現的,咱們用不着跟蹤它們的版本。第二行告訴 Git 忽略全部以波浪符(~
)結尾的文件,許多文本編輯軟件(好比 Emacs)都用這樣的文件名保存副本。此外,你可能還須要忽略 log
,tmp
或者 pid
目錄,以及自動生成的文檔等等。要養成一開始就設置好 .gitignore
文件的習慣,以避免未來誤提交這類無用的文件。版本控制
文件 .gitignore
的格式規範以下:
#
開頭的行都會被 Git 忽略。/
)說明要忽略的是目錄。!
)取反。所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式。星號(*
)匹配零個或多個任意字符;[abc]
匹配任何一個列在方括號中的字符(這個例子要麼匹配一個 a,要麼匹配一個 b,要麼匹配一個 c);問號(?
)只匹配一個任意字符;若是在方括號中使用短劃線分隔兩個字符,表示全部在這兩個字符範圍內的均可以匹配(好比 [0-9]
表示匹配全部 0 到 9 的數字)。
咱們再看一個 .gitignore
文件的例子:
# 此爲註釋 – 將被 Git 忽略 # 忽略全部 .a 結尾的文件 *.a # 但 lib.a 除外 !lib.a # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO /TODO # 忽略 build/ 目錄下的全部文件 build/ # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/*.txt # ignore all .txt files in the doc/ directory doc/**/*.txt
A **/
pattern is available in Git since version 1.8.2.