雙十一在家學用 Git

對於全部的開發者來講,掌握一門代碼版本控制系統都是必須的,不管是本身作項目,團隊合做,工做中的合做,都離不開版本控制系統的幫助。然而目前大多數初學的開發者還不瞭解或者還停留在幾個經常使用的指令,那麼毫無疑問是不夠的。詳細的瞭解 Git 和如何高效的使用 Git 是這篇文章要說的。html

兩種主要的版本控制系統

版本控制系統主要分爲兩個類型:集中式和分佈式。相信如今還有很多的公司或團隊選擇的版本控制系統是 svn ,svn就是一個典型的集中事版本控制系統。而 Git 則是一個分佈式版本控制系統。git

什麼是集中式版本控制系統

集中式版本控制系統須要一臺服務器做爲中央服務器,這個服務器充當咱們的完整版本庫,咱們的其餘開發者必須聯網才能使用版本控制系統向咱們的中央服務器提交代碼和下載代碼,全部開發者都是對同一個 完整版本庫 進行操做。數據庫

什麼是分佈式版本控制系統

在分佈式版本控制系統中,每個開發者的電腦均可以做爲一個完整版本庫,不管是否聯網開發者均可以向代碼庫進行提交修改等操做,一般狀況下須要藉助一臺服務器以方便你們交換代碼,全部開發者將本身的完整代碼庫與服務器進行同步來進行代碼的交換。服務器

gitsvn

分佈式版本控制系統的優點

分佈式版本控制系統的優點在於開發者不管是否聯網,均可以進行工做,將修改提交到本身的完整版本庫中。同時每一個開發者都擁有這個完整版本庫,因此也沒必要擔憂因中央服務器出問題而致使因此人都沒法工做。並且git的分支切換等操做是基於指針位置的移動,因此性能高。分佈式

Git 代碼庫的分區

在本地文件夾下初始化一個git倉庫後,這個倉庫存在三個分區:工做區,索引區和數據庫。svn

gitArea

  1. 工做區: 是咱們實際操做的區域,也就是說,咱們開發時,看到的都是工做區的代碼,任何的修改都是對工做區的直接修改。
  2. 數據庫: 則是咱們的完整版本庫,它保存咱們對代碼的最終修改,也是代碼最終的結果。
  3. 索引區:工做區和數據庫之間存在着一個索引區,它是爲了向數據庫提交做準備的區域。

基本的操做

初始化倉庫:性能

git init

將工做區的修改添加到索引區:fetch

git add <filename>

將修改的文件添加到索引區,能夠經過通配符 「*」 ,或「.」來進行批量的操做:url

git add file1 file2 file3 // 將指定的多個修改文件添加到索引區
git add *.txt // 將全部txt文件添加到索引區
git add . // 將全部的文件添加到索引區

將索引區中的內容添加到數據庫spa

git commit -m "本次提交的信息"

這樣咱們就完成了一次完整的修改和提交。

status 和 log

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

能夠查看當前的狀態,好比處於哪個分支,是否有修改未提交,哪些文件被修改了等等的信息。

git log

能夠查看到目前爲止的全部的提交記錄,它會顯示每個提交的用戶、時間、提交信息。

分支(branches)

在 Git 中分支的本質實際上是一個指向最新提交的指針,建立不一樣的分支實際就是建立了多個指針。每個分支互不影響,能夠平行的進行開發,負責不一樣的任務。

branch

建立新分支,好比新建名爲test的分支:

git branch test

切換分支,進入test分支:

git checkout test

合併分支,在master分支中將test分支的修改合併進來:

// 在master分支中
git merge test

刪除分支test

git branch -d test

遠程倉庫

克隆與關聯

前面提到了全部開發者將本身的完整代碼庫與遠程倉庫進行同步來進行團隊合做開發,
經過如下命令克隆或者說下載遠程倉庫到本身的電腦:

git clone [repository url]

克隆後能夠獲得一個與遠程倉庫關聯的本地倉庫。也能夠經過如下命令來直接關聯遠程倉庫:

// 將指定地址的遠程數據庫關聯,並命名爲origin
git remote add origin [repository url]

顯示遠端數據庫列表,如:

$ git remote
origin

推送內容與分支修改

向遠程倉庫推送修改,好比將本地master分支代碼推送到遠程倉庫的master分支:

git push -u origin master

第一次提交的時候一般帶上參數 -u ,它的做用是記錄此次操做的遠程倉庫地址等信息。那麼咱們使用例如 git pull 等命令時後面就不須要再加上對於的分支地址了。不是第一次提交的話能夠省略 -u

刪除本地某分支後,同步遠程數據庫,刪除遠程數據庫上的此分支:

git push origin --delete <分支名稱>

想將標籤也推送到遠程數據庫:

git push origin --tags

拉取內容與分支修改

將遠程倉庫分支的最新變化拉去下來,併合併到本身的代碼中:

git pull origin <遠程倉庫分支名稱>

默認狀況下,git pull 不會同步遠程數據庫刪除的分支,加上參數-p能夠在本地刪除遠程數據庫中已經刪除的分支:

git pull -p

將遠程的數據庫的變化提取下來查看,但不合並到當前本身的代碼中:

git fetch <遠程數據庫名稱> <分支>

這樣會將遠端的變化提取到本地,在本地能夠經過切換到"遠程數據庫/分支"來進行查看,好比查看遠端master分支的修改:

git checkout origin/master

能夠經過git branch指令與隊友參數查看全部分支:

// 查看本地和遠程全部分支
$ git branch -a
* master
  remotes/origin/master
  
// 查看遠程全部分支
$ git branch -r
  origin/master

標籤操做

tag1

標籤分爲兩種:

  1. 輕量標籤
  2. 註解標籤

輕量標籤一般做爲臨時標籤方便咱們的開發,註解標籤一般爲上線的代碼標記版本信息,能夠經過如下指令建立一個輕量標籤:

git tag <標籤名稱>

還能夠給標籤添加信息備註來建立一個註解標籤

git tag -a <標籤名稱> -m "備註信息"
// 好比:
git tag -a v1.0 -m "first version"

能夠經過如下指令查看已有標籤:

$ git tag
v1.0

加上參數 -n 能夠連備註一塊兒查看:

$ git tag -n
v1.0            first version

刪除分支:

git tag -d <分支名稱>

實際開發中運用標籤

咱們想查看某個標籤的內容:

git checkout <標籤名稱>

這樣就能夠進入到當前分支中的對應標籤中,可是這隻能查看標籤的內容。
若是你想基於該標籤繼續進行開發,那麼應該先基於該標籤新建一個分支,在新分支上進行開發,而後再合併。

git branch <分支名稱> <標籤名稱>

這樣就能夠基於某一版本並行的開發。

進階操做

覆蓋或修改最近的提交

有時候咱們想要用當前的提交去覆蓋上一次的提交,避免提交歷史中存在多餘的提交歷史,咱們可使用 --amend參數:

git add <文件名>
git commit --amend -m "新的commit備註"

經過

git log

查看提交記錄能夠發現這次提交替代了上一次的提交。

取消上一次的提交(版本回退)

HEAD1

有時候咱們須要取消上一次的提交,那麼咱們能夠經過 reset 指令修改 HEAD 指向的位置來實現:

git reset --hard HEAD~
// ~的數量表示取消提交的數量,若是要取消強兩次提交的話能夠改成 HEAD~~

能夠經過查看文件內容或查看git日誌的方式來查看是否成功取消了修改。
這裏的hard模式的意思是:索引區和工做去都會受到影響,回退到對應的內容。除此以外還有其餘的模式:

  1. --soft:僅HEAD的指向退回到對應位置,索引區和工做區內容不變。
  2. --mixed:HEAD位置和索引區內容發送改變,工做區不變。
  3. --hard: HEAD位置和索引區和工做區內容都發送改變。

版本恢復

若是咱們版本回退後後悔了想恢復到最新版本怎麼辦?能夠經過commit id來進行移動。

git reset --hard <對應的 commit -id>

若是咱們沒有記住對應的 commit id 怎麼辦?能夠經過 git reflog 指令來查看命令歷史。

$ git reflog
9154108 (tag: v1.1, tag: v1.0, origin/master, master) HEAD@{12}: pull: Fast-forward
1319463 HEAD@{13}: checkout: moving from 9154108ced0df7f7c220bc5440af008aff330e92 to master
9154108 (tag: v1.1, tag: v1.0, origin/master, master) HEAD@{14}: checkout: moving from master to origin/master
1319463 HEAD@{15}: commit (initial): first commit

這樣就能夠看到每次提交操做對應的 id(第一列) 了,那麼咱們想移動到哪一個版本均可以了。

參考資料

猴子都能懂得git教學

阮一峯git指令

相關文章
相關標籤/搜索