聲明:本文章是作者學習廖雪峯老師的Git教程後所做的簡單總結,詳細的教程請參見廖雪峯的官方網站
一、集中式和分佈式版本控制系統的區別
1、項目代表:
CVS和SVN是集中式的版本控制系統;
Git是分佈式版本控制系統。
2、區別:
集中式版本控制系統中,版本庫是放在中央服務器的,每次工作的時候從中央服務器請求獲取最新的版本,做完工作後再把新的內容推送給中央服務器,最大毛病是必須聯網才能工作,服務器如果出了問題,會直接影響所有人的工作。
相反,分佈式版本控制系統沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,也就是說工作的時候不需要聯網。分因爲沒有“中央服務器”,布式版本控制系統的安全性要高很多,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。
在實際使用分佈式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因爲可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分佈式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。
二、安裝Git
Linux和Mac OS上安裝我還沒有試過,Windows上安裝Git過程也不復雜,直接從Git官網下載安裝程序,然後默認選項安裝即可。
安裝成功後,可以在開始菜單裏找到“Git”->"Git Bash",運行彈出一個命令行窗口,就說明Git安裝成功。可以將“Git Bash”添加到鼠標右鍵,使用起來比較方便。
安裝完成後,需要進行最後一步設置,在命令行輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
因爲Git是分佈式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。
三、創建版本庫
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
創建版本庫分兩步:
1、找個合適的地方,創建一個空目錄;
2、通過git init 命令把這個目錄變成Git可以管理的倉庫。
把文件添加到版本庫步驟:
1、用命令 git add <file> 把文件添加到倉庫,注意,可反覆多次使用,添加多個文件;
2、用命令 git commit 把文件提交到倉庫;
爲了保險起見,可以在GitHub創建一個Git倉庫,讓本地倉庫與GitHub倉庫進行遠程同步,這樣一來,GitHub上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作。
1、登陸GitHub,創建一個新的倉庫;
2、使用命令 git remote add origin git@server-name:path/repo-name.git 來關聯一個遠程庫,注意server-name和repo-name分別是你的GitHub賬戶名和新建的倉庫名,添加後,遠程庫的名字就是origin;
3、關聯後,使用命令 git pushi -u origin master 第一次推送master分支所有的內容;此後,可以使用命令 git push origin master 推送最新的修改。
也可以先創建遠程倉庫,再從遠程倉庫克隆;或者當需要最新一份版本時從遠程倉庫克隆:
1、首先獲取倉庫的地址,然後使用 git clone 命令克隆;
2、克隆完成後再本地工作,然後 通過 add、commit 、push 更新版本;
3、Git支持多種協議,包括https,但通過ssh支持的原生 git 協議速度最快。
四、概念解讀
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。
工作區:就是你電腦裏能看到的目錄,比如一個項目文件夾就是一個工作區。
版本庫:工作區有一個隱藏目錄 .git ,這個不算在工作區內,而是Git的版本庫。Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master
,以及指向master
的一個指針叫HEAD
。
Git跟蹤並管理的是修改操作,而非文件,每次修改,如果不用 git add 到暫存區,那就不會加入到 commit 中。
五、本地工作時的常用命令
1、版本回退相關:
- 使用命令 git reset --hard commit_id 在提交版本之間來回穿梭,注意 HEAD指向的是當前版本,HEAD^指向的是上一個版本,HEAD^^指向上上個版本,HEAD~100表示往上100個版本;
- 跳轉版本前,用 git log 可以查看提交歷史,確定要回退到哪個版本;
- 用 git reflog 查看命令歷史,確定要回到未來的哪個版本。
2、撤銷修改:
- 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令
git checkout -- file
。 - 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令
git reset HEAD <file>
,就回到了場景1,第二步按場景1操作。 - 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,就只有進行版本回退了,不過前提是沒有推送到遠程庫。
- 用 git status 命令可以查看倉庫當前的狀態。
3、刪除文件:
- 使用 git rm file 命令刪除版本庫中的文件,並且進行 git commit 操作;
- 注意:先手動刪除文件,然後使用git rm <file>和git add<file>效果是一樣的。
git checkout
其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。- 命令
git rm
用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。
六、多人協作時常用命令:
查看分支:
git branch
創建分支:
git branch <name>
切換分支:
git checkout <name>
創建+切換分支:
git checkout -b <name>
合併某分支到當前分支:
git merge <name> 注意:合併分支時,加上
--no-ff
參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward
合併就看不出來曾經做過合併。刪除分支:
git branch -d <name>
- 查看分支合併圖:
git log --graph
保存工作現場:
git stash
返回工作現場:
git stash pop
- 丟棄一個沒有合併過的分支,可以通過 git branch -D <name> 強行刪除
查看遠程庫信息,使用
git remote -v
;本地新建的分支如果不推送到遠程,對其他人就是不可見的;
從本地推送分支,使用
git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交;在本地創建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致;建立本地分支和遠程分支的關聯,使用
git branch --set-upstream branch-name origin/branch-name
;從遠程抓取分支,使用
git pull
,如果有衝突,要先處理衝突。rebase操作可以把本地未push的分叉提交歷史整理成直線;
rebase的目的是使得我們在查看歷史提交的變化時更容易,因爲分叉的提交需要三方對比。
命令
git tag <tagname>
用於新建一個標籤,默認爲HEAD
,也可以指定一個commit id;命令
git tag -a <tagname> -m "blablabla..."
可以指定標籤信息;命令
git tag
可以查看所有標籤。
命令
git push origin <tagname>
可以推送一個本地標籤;命令
git push origin --tags
可以推送全部未推送過的本地標籤;命令
git tag -d <tagname>
可以刪除一個本地標籤;命令
git push origin :refs/tags/<tagname>
可以刪除一個遠程標籤。
七、總結
學習廖老師,附上一份外國網友製作的Git Cheat Sheet ,建議打印出來備用:
再次感謝廖老師如此細緻的教程。