開發工具之Git工具--版本控制神器
寫在前面
Git版本控制工具是由Linux之父 Linus Torvalds 開發的,Git工具的出現降低了軟件版本維護的成本,極大的提高了工作效率。熟練的使用Git工具是一個合格的開發者的基本技能。而關于Git我們學習的重點和難點有兩部分, 第一就是Git復雜的指令 ,這些指令我希望你不要去背它,那將會是一件非常痛苦的事情。所謂熟能生巧,你只需要多多使用它即可,實在想不起某個指令查就是了。 第二就是Git的思想 ,想學好Git,就必須得對Git的思想有很好的理解,否則你始終有一種很不爽的感覺,總想抓住點什么卻總又抓不住....= =
一、版本控制工具的分類
目前市面上的版本控制工具主要分為 集中式版本控制工具 和 分布式版本控制工具 兩種。
- 集中式版本控制工具
帶頭大哥——SVN。它有一個中央服務器控制著所有的版本管理,所有的終端都可以對這個中央庫進行操作,中央庫保證版本的唯一性。
缺點:
1.安全性差 如果中央服務器出現故障,那么整個項目的版本控制將要付出沉重的代價。
2.通信頻繁 終端無論是提交修改還是獲取更新都需要不斷與服務器進行通信,一旦網絡出現故障,就很難再繼續操作下去。 - 分布式版本控制工具
分布式版本控制工具終端可以獲取到中央服務器的完整信息,就好像做了一個完整的鏡像。這樣我們就可以在終端獲取各種信息,提交管理我們的代碼而不需要與服務器頻繁通信,即使中央服務器出故障,各個終端仍有完整的備份。但實際上分布式版本控制工具也有一個“中央服務器”,它的作用主要是用來最后提交代碼和方便拉取備份的,并不會像集中式版本控制工具那樣嚴重依賴網絡。
二、Git的安裝與配置
關于Git的 安裝 沒什么值得說的,直接下一步即可。安裝完Git后,在控制臺輸入 git 只要出現一屏你看不懂的東西就表示你成功了!
對Git Global參數進行配置:
打開Git cmd 輸入如下內容可以增添一個配置
git config --global --add user.name xxx user.email xxx@xx.com
刪除一個配置:
git config --global --unset user.name xxx
三、Git指令
接下來我們學習Git指令,這些指令你將會反復查閱實踐,只有這樣你才能做到知行合一,大師可成也。
接下來的指令,你可以跟我一步一步的來,我們共同學習。你可以隨便在某處建一個文件夾,比如桌面,然后進入這個文件夾-右鍵- Git Bash Here
多說一句,Git GUI Here是指在當前目錄打開Git圖形化工具,Git Bash Here 是在當前目錄打開命令行工具。而我們要學的 就是Git Bash Here,因為Git GUI Here已經不用我教你。
-
創建Git倉庫
為了管理代碼,代碼要關在倉庫里面。倉庫是 自己創建 或者 clone 的。
1. Git init——將一個目錄快速設置為Git代碼倉庫
倉庫創建成功后,會在當前目錄中生成一個.git目錄,這是一個隱藏文件夾,包含所有的版本和配置信息。關于這個文件夾的目錄結構,這里先不說,等你對Git思想掌握后,再去研究也不遲。
2. Git clone——clone一個倉庫
我們可以在github上clone一個遠程倉庫到本地。
在clone的時候,可以選擇HTTPS或者SSH,一般我們都會使用SSH,因為HTTPS要求帳戶密碼驗證。
得到地址后,使用 git clone 某倉庫地址 命令如下:
可以看到,遠程倉庫已經clone下來了。
-
提交修改
為了演示方便,可以先在文件夾中創建一個文本文件test.txt,然后隨便寫點什么,使用 git status 查看當前倉庫狀態:
可以看到 Git追蹤到了新的文件,并提示我們使用 git add <file> 添加版本控制。最后使用 git commit <file> --m "提交描述" 將add后的文件提交到代碼倉庫:
你可以使用 git log 或者 git shortlog 查看提交記錄,其中 git shortlog 是按照提交者分類的一個簡短log日志。
-
追加修改
當想要修改 上次提交描述信息(即:--m后面的描述) 的時候,可以使用 git commit --amend -m ''提交描述信息" :
-
查看倉庫狀態
通過查看倉庫狀態,我們能夠了解當前文件狀態以及版本之間的差異。除了使用前面提到的 git status 指令,我們還可以使用 git diff <file> 指令查看某文件的具體變化內容,使用 git diff "節點名稱" 比較與指定節點之間的差異:
節點名稱可以指定為HEAD、HEAD^、HEAD^^、HEAD^^^...分別代表當前版本,上一版本,上上版本,以此類推。
-
版本歷史
一個倉庫中通常會有非常多次的add和commit,這些過程都會被git記錄下來,使用 git log 指令,會列出所有的提交記錄。使用 gitk 指令查看圖形化的log記錄:
commit id 是一個40位16進制的SHA-1 hash code用來唯一標記一個commit。
gitk圖形化工具比命令行展示的信息更加條理豐富,Git會將commit串成一條時間線,每個點就代表一個commit。
除此之外,還可以使用 git blame 指令追溯一個指定文件的歷史修改記錄:
注意信息中列出了不同的id 修改者 時間 和 內容
-
Git的操作區域
Git通常是工作在三個區域上的,即工作區,暫存區和歷史區。其中,工作區就是開發者平時工作,修改代碼的區域;歷史區是用來保存各個版本的區域;暫存區則是Git的核心所在,它被保存在 .git/index 文件中。
git管理修改的是內容而不是文件,每個SHA-1的值也是根據內容計算出來的。
我們執行add操作實際上是將修改的記錄保存到暫存區,執行commit操作就是就是將暫存區的內容全部提交到歷史區。
-
Git回退
回退主要包括add操作之前,add操作之后但還沒有執行commit操作,commit操作之后這樣三種情景。
1. git checkout <file> 指令:主要用在add操作之前和add操作之后commit操作之前,如果你在這兩種情境下,修改了文件內容,想要回到修改文件內容之前,就可以使用這個指令,如圖:
git checkout操作實際上是用版本庫里的版本(包括歷史區和暫存區)替換工作區中的版本!
你一定會有一個疑問,前面我們的回退操作并沒有跨越工作區,那么我們怎么從暫存區甚至是歷史區(也可以理解為撤銷add以及commit)指令呢?別急,馬上講解!
2. git reset HEAD <file> 指令和 git reset <last commit id> <file> 指令:
前一個指令 用于commit之前 ,撤銷add指令,即退出暫存區到工作區。
后一個指令用于commit之后,撤銷commit指令,使用這個指令可以實現任意版本之間的跳轉,當然"last commit id"不能是當前版本id。
3. git reset --hard HEAD^ 指令:這個指令也是用于回退版本的。回退到上一個版本寫作HEAD^,上一百個版本寫作HEAD~100。這個指令和上一個指令 git reset 的區別就是,上一個指令可以在任意版本之間 "跳轉" ,而本指令回退到某一個版本后,會把之后的版本全部刪除。
note: 使用git reset指令進行版本回退后,使用git log指令你會發現之后的版本commit id都消失了,怎么辦呢?其實,我們可以使用git log指令的pro版——git reflog指令解決這個問題,此處不再演示。
-
Git文件操作
Git提供了類似Linux的文件管理基本指令,下面介紹一下刪除和暫存文件指令。
1. shell的rm命令
執行shell的rm命令,可以將某一文件刪除,Git不僅可以監聽到增加、修改文件,還可以監聽到刪除文件,同樣需要通過git add/commit操作來完成一次新的提交。
2. git rm 命令
git rm命令和shell rm命令的區別在于git rm命令省去了git add操作。
3. 文件暫存
這里的文件暫存,是指一次備份與恢復操作。
怎么理解這個概念呢?你可以想象一種這樣的開發情景:你在某一git 分支開發新功能,這時上司交給你一個新的任務,修復上一版本的bug。你是不能直接在當前分支拉取分支修復bug的,因為當前分支的代碼并不完善,可能會出現各種各樣的問題,甚至編譯都不能通過。這時候,我們可以使用git stash命令將當前修改暫存起來,從其修改之前的分支拉取分支,進行bug的修復。bug修復完成后,可使用git stash list 指令查看之前儲存的內容,使用 git stash apply指令或者git stash pop指令進行內容恢復(區別:前者不會刪除記錄,后者會)。
結語
考慮到篇幅問題,本文就先寫到這里。但你要知道Git工具的使用遠遠不止這些,后續文章中 我將會繼續介紹Git的遠程倉庫,分支管理,Tag等知識點,這些知識也都是非常重要的 。 學習Git,你最好親自去敲敲命令,光看是遠遠不夠的。
寫這一系列的關于Git工具的使用的博客,一是為了分享知識,一是為了整理一下知識點,方便復習查閱。文中有錯誤,或者是概念理解不一致的地方歡迎大家留言討論。
來自:http://www.jianshu.com/p/4f823ee912a6