Git 是一個以命令行為主的免費(fèi)開源的分布式版本控制系統(tǒng),用于敏捷高效的處理任何或大或小的項(xiàng)目。是Linus Torvalds 為了幫助管理Linux內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件。常見的CVS,SVN等都是集中式的版本控制系統(tǒng)。

版本控制系統(tǒng):集中式vs分布式
集中式版本控制系統(tǒng),版本庫是集中存放在中央服務(wù)器的,修改項(xiàng)目時(shí)需要先從中央服務(wù)器取得最新版本,然后修改,再將修改后的版本提交到中央服務(wù)器上。

集中式版本控制系統(tǒng)有很多好處,比如管理員可以充分了解每個開發(fā)者的進(jìn)度,但也有以下問題:第一,需要聯(lián)網(wǎng)工作,在網(wǎng)速不好的環(huán)境下效率非常地下;第二,若中央服務(wù)器發(fā)生故障,整個項(xiàng)目有可能會丟失所有歷史更新記錄。
而分布式版本控制系統(tǒng)則不同,沒有中央服務(wù)器,每個人都是一個完整的版本庫,因此工作時(shí)不需要聯(lián)網(wǎng),只要在需要時(shí)將修改推送即可,因此安全系數(shù)也高很多,某一人的電腦發(fā)生故障并不會影響整個項(xiàng)目,其他人電腦中也有。

Linux上安裝Git
- 在終端輸入
git,看系統(tǒng)是否安裝Git - 若終端顯示為
$ gitThe program 'git' is currently not installed. You can install it by typing:sudo apt-get install git
則沒有安裝,通過指令sudo apt-get install git 完成Git的安裝
常用Git操作
- 配置Git基本信息:git config
- 添加Git忽略文件:.gitignore
- 創(chuàng)建版本庫:git init
- 創(chuàng)建和刪除分支:git branch
- 切換到某個分支:git checkout
- 查看倉庫的狀態(tài):git status
- 把某個文件添加到git暫存區(qū)域:git add
- 把暫存區(qū)域的內(nèi)容提交到本地倉庫:git commit
- 查看修改內(nèi)容:git diff
- 重置代碼:git reset
- 把本地倉庫推送到遠(yuǎn)程倉庫:git push
- 把遠(yuǎn)程倉庫clone到本地:git clone
- 把遠(yuǎn)程代碼拉到本地:git pull
- rebase: git rebase
1、配置Git 基本信息
git config --global user.name "<username>"
git config --global user.email "<email>"
配置全局Git的用戶名和郵箱設(shè)置,之后每一次Git的提交都會使用這些信息,也可通過以下命令查詢當(dāng)前Git的配置
git config --list

2、添加Git忽略文件
有些在Git工作目錄中的文件比較重要或個人,不能提交他們,可以在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore文件,然后將要忽略的文件名填進(jìn)去,Git就會自動忽略這些文件。.gitignore 文件一般不存在,需要倉庫根目錄下手動創(chuàng)建,并且可以對 .gitignore 做版本管理。
忽略文件的原則:
(1)忽略操作系統(tǒng)自動生成的文件,比如縮略圖等;
(2)忽略編譯生成的中間文件、可執(zhí)行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進(jìn)版本庫,比如Java編譯產(chǎn)生的.class文件;
(3)忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
Git 對于 .ignore 配置文件是按行從上到下進(jìn)行規(guī)則匹配的,意味著如果前面的規(guī)則匹配的范圍更大,則后面的規(guī)則將不會生效。下面列舉幾個常用的配置語法。
(1)以斜杠“/”開頭表示目錄;
(2)以星號“*”通配多個字符;
(3)以問號“?”通配單個字符
(4)以方括號“[]”包含單個字符的匹配列表;
(5)以嘆號“!”表示不忽略(跟蹤)匹配到的文件或目錄;
3、創(chuàng)建版本庫/倉庫
版本庫,又叫倉庫,可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史,或者在將來某個時(shí)刻可以“還原”。
第一步,創(chuàng)建一個空目錄
mkdir <repository_name>
cd <repository_name>
第二步,通過git init命令把這個目錄變成Git可以管理的倉庫

此時(shí),空倉庫就創(chuàng)建好了,列表顯示當(dāng)前空文件夾下有一個隱藏目錄 .git,這個目錄是Git用來跟蹤管理版本庫的,非常重要。
4、查看倉庫狀態(tài)
git status
查詢當(dāng)前版本庫的狀態(tài),若在本地倉庫有有任何文件內(nèi)容的改變,Git會檢測到該文件,并顯示
5、將文件添加到版本庫
本地倉庫由git維護(hù)的三棵“樹“組成。第一個是工作目錄(Working Dir),它持有實(shí)際文件;第二個是暫存區(qū)(Index),像個緩存區(qū)域,臨時(shí)保存文件的改動;第三個是Head區(qū),指向最后一次提交的結(jié)果。

前提:添加文件到版本庫,一定要將文件放在版本庫目錄下(或子目錄下)。
第一步:用命令git add添加到暫存區(qū)
git add <filename>
第二步:用命令git commit實(shí)際提交改動
git commit -m "<information>"
-m后面輸入的是本次提交的說明文檔,可以方便自己和別人閱讀,也可以省略,但不建議。同時(shí),可以多次add不同文件,commit可以一次提交多個文件,比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files"

注:現(xiàn)在的改動已經(jīng)提交到了HEAD,但還沒有到遠(yuǎn)端倉庫。
6、查看修改內(nèi)容
git diff <file_name>
git diff顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式,可以從上面的命令輸出看到文件的修改內(nèi)容。

7、版本回退
git reset --head <commit_id>
HEAD 指向的版本就是當(dāng)前版本,Git允許我們在版本的歷史之間回退;回退前,用git log可以查看提交歷史,以便確定回退到哪個版本;要重返現(xiàn)在版本,用 git reflog 查看命令歷史,以便確定要回到未來的哪個版本
8、撤銷修改
- 文件在工作區(qū),丟棄修改
git checkout -- <file_name>
- 文件在暫存區(qū),丟棄修改
git reset HEAD <file_name>
git checkout -- <file_name>
9、刪除和重置文件
第一步:刪除本地文件
rm <file_name>
第二步:分兩種情況
- 確實(shí)刪除,從版本庫中也刪除
git rm <file_name>
git commit -m "<remove_info>"
- 刪錯了,從版本庫恢復(fù)到最新版本
git checkout -- <file_name>
10、分支的創(chuàng)建刪除合并
分支是用來將特性開發(fā)絕原來來的,我們創(chuàng)建倉庫時(shí),master是默認(rèn)分支,可以在創(chuàng)建其他分支,在該分支上進(jìn)行開發(fā),完成后將它們合并到主分支上,并根據(jù)需要選擇是否刪除該子分支。

查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git branch -b <name>
合并某分支到當(dāng)前分支:git merge <name>
刪除分支:git branch -d <name>

11、Rebase
git checkout <name1>
git rebase <name2>
rebase 用于把一個分支的修改合并到當(dāng)前分支
注:rebase和merge都是用于合并分支,具體區(qū)別見這里,同時(shí)要知道,使用git pull時(shí)默認(rèn)是merge, 加 --rebase參數(shù)使其使用rebase方式。
12、標(biāo)簽
git tag <tag_id> <commit_id>
為軟件發(fā)布創(chuàng)建標(biāo)簽,這個概念早已存在,在SVN中也有,可以通過git log命令獲取提交ID,可以使用少一點(diǎn)的提交ID前幾位,只要它的指向具有唯一性。
| 命令 | 意義 |
|---|---|
git tag |
查看所有標(biāo)簽 |
git tag <name> |
新建一個標(biāo)簽,默認(rèn)為HEAD,也可以指定一個commit id |
git push origin <tagname> |
推送一個本地標(biāo)簽 |
git push origin --tags |
推送全部未推送過的本地標(biāo)簽 |
git tag -d <tagname> |
刪除一個本地標(biāo)簽 |
git push origin :refs/tags/<tagname> |
刪除一個遠(yuǎn)程標(biāo)簽 |
Git中關(guān)于遠(yuǎn)程倉庫,工作區(qū)和暫存區(qū)等內(nèi)容,會在后續(xù)博客進(jìn)行介紹。
參考資料
git入門文檔
視頻教程《版本控制入門 – 搬進(jìn) Github》
Git學(xué)習(xí)資源指南
Git簡明指南
免費(fèi)的git書箱 progit2
git常用命令手冊
廖雪峰的git在線教程
在線嘗試git ( 中文翻譯在這里)
Git學(xué)習(xí)資源匯總
git merge和git rebase小結(jié)