談談 Git
Git是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。它是Linus Torvalds爲了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。Git與常用的版本控制工具CVS,Subversion等不同,它採用了分佈式版本庫的方式,不必服務器軟件支持。
1.集中式vs分佈式
CVS和SVN都是集中式的版本控制系統,而Git是分佈式控制系統,集中式和分佈式版本控制系統有什麼區別呢?
集中式版本控制系統:版本庫是集中存放在中央服務器的,而幹活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央服務器。
集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快,可如果在互聯網上,網速慢的話,可能提交一個10M的文件就需要5分鐘。
分佈式版本控制系統:沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,工作時就不需要聯網了。那麼多個人如何協作呢?比方說你在自己電腦上改了文件A,同事在他的電腦上也改了文件A,這時,你倆只需把各自的修改推送給對方,就可以互相看到對方的修改了。
和集中式版本控制系統相對 ,分佈式版本控制系統的安全性要高很多,因爲每個人電腦裏都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法幹活了。
2.創建版本庫
初始化一個Git倉庫,使用git init命令。
添加文件到Git倉庫,分兩步:
- 使用命令git add <file>,注意,可反覆多次使用,添加多個文件;
- 使用命令git commit -m <message>,完成。
注:
(1)git add 命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit 就可以一次性把暫存區的所有修改提交到分支。
(2)每次修改,如果不用git add 到暫存區,那就不會加入到commit中。
3.標籤管理
發佈一個版本時,我們通常先在版本庫中打一個標籤(tag),這樣,就唯一確定了打標籤時刻的版本。將來取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。所以,標籤也是版本庫的一個快照。
tag說白了就是一個讓人容易記住的有意義的名字,它跟某個commit(分支)綁在一起。
- git tag <tagname>:用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;
- git tag -a <tagname> -m "blablabla...":指定標籤信息;
- git tag:查看所有標籤。
4.其他命令
- git diff:查看修改內容。
- git status:查看當前倉庫的狀態。
- git log:顯示從最近到最遠的提交日誌。
- git checkout --file:丟棄工作區的修改。git checkout 其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
- git reset HEAD <file>:不但改亂了工作區某個文件的內容,還添加到了暫存區,想丟棄修改,分兩步,第一步用該命令,第二步用git checkout --file。
- git rm:用於刪除一個文件。
- git branch -D <name>:強行刪除命令,用於丟棄一個沒有被合併過的分支。
- git remote -v:查看遠程庫信息。
- git push origin branch-name:從本地推送分支。如果推送失敗,先用git pull抓取遠程的新提交。
- git branch --set-upstream branch-name origin/branch-name:建立本地分支和遠程分支的關聯。
5.GitHub
我們一直用GitHub作爲免費的遠程倉庫,如果是個人的開源項目,放到GitHub上是完全沒問題的。其實GitHub還是一個開源協作社區,通過GitHub,既可以讓別人參與你的開源項目,也可以參與別人的開源項目。在GitHub上,利用Git極其強大的克隆和分支功能,人們可以自由參與各種開源項目。
注:在參與一個開源項目時,一定要從自己的賬號下clone倉庫,這樣才能推送修改。如果從作者的倉庫地址克隆,由於沒有權限,將不能推送修改。
6.碼雲
使用GitHub時,國內的用戶經常遇到的問題是訪問速度太慢,有時還會出現無法連接的情況。
如果希望體驗Git飛一般的速度,可以使用國內的Git託管服務——碼雲(gitee.com)。
下面是Git Cheat Sheet:
https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf