Git作為一個複雜的版本控制系統,指令之多,相信很多小白已經望而卻步,有的嘗試幾次,久攻不克,也隻能望洋興歎。标題起的是15分鐘,可是真的能15分鐘掌握麼??想什麼呢?怎麼可能?哈哈,15分鐘隻是個噱頭,意思就是快,如果還是按照傳統的套路從命理講起,根本無從“快”起,是以筆者另辟蹊徑,這裡要介紹的Git,不同于一般的教科書 —— 先講抽象概念,再講事物本身的流程。我覺得先建立直覺的模型比較重要,讓你先用上Git,再去學Git;先用GUI(圖形界面)在談CLI(指令行),我相信這會更容易讓人接受。
嚴格的說,本教程應該稱作SourceTree入門指南,哈哈。因為下面要借助一個圖形化的軟體,SourceTree,來講Git。SourceTree下面簡稱ST。ST是Git的第三方用戶端,特點是比較直覺,而且呢,不違背Git的邏輯,這裡說多了就略顯複雜,有些用戶端會封裝Git的指令操作,隐藏了過多的細節,反而不好學習Git……總之,ST挺好,界面也好看,缺點就是有點慢,不過沒關系。
核心思想就是 —— 用ST來降低門檻,先讓你看到Git做了什麼,給你直覺上的了解,再談CLI。畢竟CLI才是最終的歸宿。
版本控制工具,現在有名的就是SVN和Git吧,其他的也有,這兩個比較主流。
小白會好奇,版本控制工具是幹嘛的?
版本控制工具,其實就是一個檔案的追蹤器,能夠記錄一個檔案的每一個改動,這樣子仿佛有助手,一直在後面幫你備份每次修改的檔案。對于你來說,仿佛你有了一個時光機,可以回到檔案的任何時候,每當你想檢視了,或者回退,你可以輕輕松松搞定。有點像打遊戲存檔,一旦會了存檔大法,多難的怪,都能幹死,反正被打死就回檔,打怪,隻是個磨時間的過程~~
Git還有分支、合并功能,當一個小團隊在共同完成一份作品的不同部分的時候,版本控制工具可以先把作品分為不同的分支,給不同的負責人,最後每個部分修改妥善,再合并這些分支,使之變成一個整體。還有……吧啦吧啦,太細就枯燥了,哈哈,不常用的,我也不會。
說到這,你是不是還有點小激動呢?
如果有一天,當你意識到,計算機本身就是把硬碟的資料讀出來,經過CPU處理,之後再放到硬碟裡儲存。整個的電腦體系就是在不斷地修改某些檔案。你會覺得Git真的是非常有用,無所不在。隻要存在修改,存在儲存,就有Git的用武之地。
小白又問了,各種不明覺厲,那SVN和Git有什麼差別?
在我看來就是設計上的差別:
SVN是中心似的,Git是分布式的,兩種設計方向,目标都是解決版本控制問題。
談不上誰個更好,誰個更壞,工具嘛,隻有順不順手。偏愛Git的人,會覺得Git更強大,同樣對Git嗤之以鼻的人,會覺得Git設計的太複雜,以至于無論是個人還是團隊,學習成本都比較高,萬一遇到一個瓶頸,沒人會用Git解決,就歇菜了,SVN相對弱,因為不能本地備份,但是也相對簡單,簡單介紹就立刻可以上手。
不過上面的難用,易用,現在已經變成相對的了,有很多出色的用戶端,比如SourceTree,已經極大的簡化了Git的使用流程,解決了很多痛點,一會我們就要介紹到它。
簡單的說,SVN就有一個中央伺服器,協調大家的代碼,大家都和它同步;Git是分布式的,每個人都保留完整的追蹤記錄,每個人可以成為一個中心。是以說SVN缺點就是,中心宕掉了,所有人都歇菜。Git人人皆可為中心。Git缺點,應該就是學起來比較複雜吧,設計的指令都比較混亂,流程也很難了解和接受,要不然SVN應該不存在了。
下面感受一下,SVN和Git的複雜度
下圖是SVN的操作邏輯:

整體來說,就是圖中心的三條線:
Checkout:克隆項目(複制代碼到本地) <— 在這裡!!!
Commit:送出本地代碼
Update:更新本地代碼
圖下面三個線:
add:添加項目
rm:删除項目
revert:撤銷
是以我站在使用者的角度,SVN的設計是清晰的
下面來看看Git
上圖!
下面是Git的操作流程:
Git的設計就複雜的多,甚至很晃眼啊
個人覺得,Git沒有在設計上,特别的在易用性上優化過,簡化過。尤其是指令,也是很随意的,後面能看到。
15分鐘雖然是個噱頭,還是來談談怎麼個15分鐘法吧。
下面的部分可以稱為《SourceTree向導》,《SourceTree圖解手冊》哈哈,沒有啦,還是要講點東西的,如果對于Git的東西一點都不講,确實應該改名字。
整個的流程,是先講解原理,再用SourceTree操作一下,後面介紹一點指令内容,我也是在學習中,有錯誤的地方,還請包涵和指正。大家共同學習,共同進步。
眼睛瞧這裡,這個就是Source Tree,下載下傳猛戳。
設計的還挺好看,咳咳,當初選擇它也是因為好看……哈哈哈,用軟體都看臉。SourceTree确實設計的很好。一會我們來探索一下它。
處女座的朋友要問了,Git用戶端千千萬,為什麼就說SourceTree?
剛才不是說了麼……看臉,哈哈,其實主要還是ST做的比較靠譜,用過一個叫做TortoiseGit的,大名鼎鼎,反正我用的時候狀況百出。
懶得推薦,而且不好看,哈哈
個人感覺軟體重新整理率不高,比如:
當你用Sublime打開檔案的時候,然後最小化,用TortoiseGit來pull最新代碼,Sublime經常不會重新整理的。
還有TortoiseGit簡化了Git的模型,取消了暫存區的概念,和Git的模型不太一樣。
總之,應該解答一部分疑惑了。Source Tree是個好東西 。
寫代碼,寫完了儲存,這是一般檔案的流程。Git多加了一個流程,就是儲存後,你要送出。Git會追蹤你每次儲存,和上次儲存之間的差别,然後把這些資訊,儲存在一個檔案夾下,檔案夾名叫.git。這個檔案夾,Git的術語裡稱之為倉庫,用倉庫可以追蹤代碼,看到每次改變了什麼,可以還原到以前的狀态,也可以看别人改了什麼,這就是代碼版本控制的本質,一種進階的儲存功能,自帶時光機的那種
現在祭上圖
咱們挨個挨個解釋一下,解釋完,大概就知道怎麼回事了。
第一遍看不懂,不放多看幾遍,或者看看其他的資料,對照着。每個人了解的點可能不一樣。
最好把這張圖,單獨開在一個視窗,對照着,下面就來解釋這個圖
首先看這張圖中間,四個圓柱 :
Workspace:工作區,就是你正在寫的代碼
index:暫存區,一個本地的緩沖區
local repository:本地倉庫
remote repository:遠端倉庫
就是你正在寫的代碼,正在打開的編輯器裡面的内容,解釋完了,就這樣
index照理應該翻譯叫索引,這裡叫暫存區
暫存區是幹嘛的?
暫存區是Git和SVN的最重要的差别之一
我們來看圖,箭頭就是代碼流動的方向
Git的流程工作流程就是:
眼前正在寫的代碼(workspace)覺得差不多了
add指令
送出到暫存區(index)類似于儲存一下
然後你可以傳回正在寫的代碼(workspace)繼續寫,寫的到了一個階段了
又送出到了暫存區(index)
對就是這樣子工作的!
舉一反三!!
重要的事情說三遍,舉一反三
當你多次送出,基本工作完成的差不多了
按照道理
你應該每次都add到了index暫存區
現在好了,任務完成
要把暫存區裡的東西,放到本地倉庫(local repository)
使用commit指令
大家看圖應該注意到
worksp –> local repository
有一個綠色的箭頭 commit -a
這條指令
就是同時完成,把目前的修改,送出到暫存區,然後把暫存區的送出到
本地倉庫
Git每次送出的,都是儲存變化的改動,不是簡簡單單的複制一遍
就是正式的代碼儲存的地方
如果你本地所有的内容都被commit到本地倉庫了
表示你已經很滿意所有的代碼
并且完成了所有的編寫
這個時候,你想把代碼上傳到Github或者公司的Git伺服器,送出給别人
看圖
local repository –> remote repository
中間是push操作
想對你正在工作的電腦,你電腦叫local,本地
網絡上的,就叫remote,遠端
就是網絡上的倉庫
一般是放在網絡上儲存
或者和團隊一起配合着幹活
網絡倉庫就成為一個中樞的感覺
我們看圖的上半部分
送出的過程,按照箭頭,由下往上:
^
|
| push:就是“推”,把本地的正式的送出代碼,推到網絡上
| commit:合并多次修改,送出到倉庫儲存
index :暫存區
| add:一段階段的代碼,儲存
Workspace:正在寫代碼,寫的不錯了
再來看看這張圖的下三路
remote repository –> workspace
這裡有一個pull 黃顔色的,操作(rebase後面講)
pull就是“拉”的意思,拉動,把網絡的代碼,拉動到本地
拉動的目标是workspace,就是你正在寫的代碼
解釋一下這裡,比如你正在寫代碼,或者打開了一個項目
編輯器Sublime Text上代碼顯示出來了,表示檔案打開了
這個時候,公司的小明告訴你,公司昨天幾位同僚加班加點,代碼更新了
讓你更新一下代碼,以獲得人家工作一晚上加班的工作成果
你這個時候就要pull,拉取最新的代碼,以保證自己和大家的工作進度一緻
pull的意義在于,執行完操作,會重新整理你的編輯器
Sublime Text上的代碼,會變化到最新的代碼
不信你試試
TortoiseGit來pull的時候,編輯器重新整理與否,似乎看心情 = =b
下面來看紅色,紅色的兩個箭頭
最左邊有一個小字
revert
意思大概是反轉,撤銷的意思
對啊,你光送出,萬一送出錯了呢?
Git裡有一套撤銷的機制
撤銷的機制尤其複雜
這裡引用一篇文章戳這裡
不過那些都不是我們要說的重點
學習嘛,要抓住主幹,細枝末節的,晚點再說,又不一定全都遇上
Git複雜的就可能是撤消了,這些我們暫時不管
下面還有兩路灰色的,左邊的說明是compare
就是可以比較你每次修改的代碼和之前的代碼有什麼差別
這是Git最重要的作用,就是可以看到每次送出的不同
這些也不說,放在後面說
現在主要的就是把上三路和pull熟悉
【工作區】->add->【暫存區】->commit->【本地倉庫】->push->【遠端倉庫】
【工作區】<------------------ pull ----------------- 【遠端倉庫】
記住:
add、commit、push、pull
Source Tree是一個優秀的,直覺式的Git的圖形界面用戶端
Source Tree用了很優雅的方式和直覺化的流程,讓你很優雅的使用Git
基本上所有常用場景下,都可以勝任,如果實在情況特殊,使用指令行
下面是Source Tree界面
Source Tree的設計符合直覺
這張圖上面的圖示,基本上是所有常用的操作了
Clone/New:Clone就是克隆,copy拷貝的另一種稱呼,這裡意思是從遠端倉庫,拷貝一個項目到本地
Commit:大家一看就明白
Checkout:沒講,簡單的說,你儲存了一個版本到暫存區,然後繼續寫,寫着寫着後悔了,挨個挨個改回去太麻煩,checkout就是從暫存區的一個儲存版本還原到正在寫的編輯器,這一點,看第一地圖,紅色的短的checkout描述的就是這個意思(checkout HEAD後面講)
Discard:丢棄
Stash:儲存你目前的所有狀态,到一個特别的檔案–>我個人覺得這個很常用,一會提到
Add:把檔案提到暫存區
Fetch:看看地圖,遠端倉庫拉去到倉庫,目前打開的編輯器不會變化
Pull:提過了
Branch:分支,這個不講,一般項目負責人負責
Merge: 合并分支,同上
覺得難記沒關系,SourceTree有中文界面可以挑
用英文,主要是和Git的指令,對應起來,有助于找規律
下面一個框區,就是diff,比較代碼不同的地方
紅色是删掉的,标記為減号
綠色是添加的,标記為加号
Source Tree實時幫你顯示,是以diff這個指令壓根不需要你敲
現在了解完畢Git的工作流程
現在讓我們用Source Tree走一遍
本篇文章就是在Github上建立的一個項目(如果不知道怎麼做,請查詢Github官方教程)
然後clone到本地
把項目添加到了Source Tree
把項目添加到Source Tree
下面簡稱SourceTree為ST
然後用編輯器打開檔案編輯,編輯完畢後,儲存檔案,這個一定要儲存,然後可以把編輯器最小化了,然後可以看看ST
點選如圖,第一步,工作副本
這個要經常點,隻要你點了,切換就會重新整理
稍微等一會,第二部的地方,就會出現檔案的修改狀态
第二部所在的區域,就是工作區,就是你編輯器,編輯器的檔案臨時狀态,可以部分選,也可以全選,選擇後,會出現如下圖:
整個項目移動到上面,就是暫存區,右邊是Diff狀态,表示你修改了什麼
送出按鈕,就是Commit,點選他,進入下圖:
如圖會跳出一個commit資訊,看過Git的同學,應該知道,每次commit都會讓你鍵入一個message,其實就是寫明,你做了什麼,改了什麼,這樣子等到回退,撤銷的時候,一看資訊就明白了
下面有一個按鈕,和上面的推送是一樣的
可以先commit,然後push
如果倉庫是配置好的
按一下,就可以送出代碼了
送出好代碼後,可以看到如圖:
左邊的分支,可以看到整體情況
右邊的字段:
圖表:一種分支圖,可以看清項目合并情況
描述:就是commit的message
送出:送出生成的hash碼
作者:誰送出的,這個團隊配合作用救命掀了
真正的複雜的項目,上一張圖,讓大家感受下:
分支情況會特别的複雜,感受下。
ST确實用圖形界面把Git的操作簡化到十分優雅的地步
Git送出代碼的流程,已經描述完畢
是不是十分簡單
------------------越是喧嚣的世界,越需要甯靜的思考------------------
合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。
積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。