天天看點

15分鐘學會使用Git

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的操作邏輯:

15分鐘學會使用Git

整體來說,就是圖中心的三條線:

Checkout:克隆項目(複制代碼到本地) <— 在這裡!!!

Commit:送出本地代碼

Update:更新本地代碼

圖下面三個線:

add:添加項目

rm:删除項目

revert:撤銷

是以我站在使用者的角度,SVN的設計是清晰的

下面來看看Git

上圖!

下面是Git的操作流程:

15分鐘學會使用Git

Git的設計就複雜的多,甚至很晃眼啊

個人覺得,Git沒有在設計上,特别的在易用性上優化過,簡化過。尤其是指令,也是很随意的,後面能看到。

15分鐘雖然是個噱頭,還是來談談怎麼個15分鐘法吧。

下面的部分可以稱為《SourceTree向導》,《SourceTree圖解手冊》哈哈,沒有啦,還是要講點東西的,如果對于Git的東西一點都不講,确實應該改名字。

整個的流程,是先講解原理,再用SourceTree操作一下,後面介紹一點指令内容,我也是在學習中,有錯誤的地方,還請包涵和指正。大家共同學習,共同進步。

眼睛瞧這裡,這個就是​​Source Tree​​,下載下傳猛戳。

設計的還挺好看,咳咳,當初選擇它也是因為好看……哈哈哈,用軟體都看臉。SourceTree确實設計的很好。一會我們來探索一下它。

15分鐘學會使用Git

處女座的朋友要問了,Git用戶端千千萬,為什麼就說SourceTree?

剛才不是說了麼……看臉,哈哈,其實主要還是ST做的比較靠譜,用過一個叫做TortoiseGit的,大名鼎鼎,反正我用的時候狀況百出。

15分鐘學會使用Git

懶得推薦,而且不好看,哈哈

個人感覺軟體重新整理率不高,比如:

當你用Sublime打開檔案的時候,然後最小化,用TortoiseGit來pull最新代碼,Sublime經常不會重新整理的。

還有TortoiseGit簡化了Git的模型,取消了暫存區的概念,和Git的模型不太一樣。

總之,應該解答一部分疑惑了。Source Tree是個好東西 。

寫代碼,寫完了儲存,這是一般檔案的流程。Git多加了一個流程,就是儲存後,你要送出。Git會追蹤你每次儲存,和上次儲存之間的差别,然後把這些資訊,儲存在一個檔案夾下,檔案夾名叫.git。這個檔案夾,Git的術語裡稱之為倉庫,用倉庫可以追蹤代碼,看到每次改變了什麼,可以還原到以前的狀态,也可以看别人改了什麼,這就是代碼版本控制的本質,一種進階的儲存功能,自帶時光機的那種

現在祭上圖

15分鐘學會使用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

15分鐘學會使用Git

Source Tree是一個優秀的,直覺式的Git的圖形界面用戶端

Source Tree用了很優雅的方式和直覺化的流程,讓你很優雅的使用Git

基本上所有常用場景下,都可以勝任,如果實在情況特殊,使用指令行

下面是Source Tree界面

15分鐘學會使用Git

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

15分鐘學會使用Git

把項目添加到Source Tree

下面簡稱SourceTree為ST

然後用編輯器打開檔案編輯,編輯完畢後,儲存檔案,這個一定要儲存,然後可以把編輯器最小化了,然後可以看看ST

點選如圖,第一步,工作副本

這個要經常點,隻要你點了,切換就會重新整理

稍微等一會,第二部的地方,就會出現檔案的修改狀态

第二部所在的區域,就是工作區,就是你編輯器,編輯器的檔案臨時狀态,可以部分選,也可以全選,選擇後,會出現如下圖:

15分鐘學會使用Git

整個項目移動到上面,就是暫存區,右邊是Diff狀态,表示你修改了什麼

送出按鈕,就是Commit,點選他,進入下圖:

15分鐘學會使用Git

如圖會跳出一個commit資訊,看過Git的同學,應該知道,每次commit都會讓你鍵入一個message,其實就是寫明,你做了什麼,改了什麼,這樣子等到回退,撤銷的時候,一看資訊就明白了

下面有一個按鈕,和上面的推送是一樣的

可以先commit,然後push

如果倉庫是配置好的

按一下,就可以送出代碼了

送出好代碼後,可以看到如圖:

15分鐘學會使用Git

左邊的分支,可以看到整體情況

右邊的字段:

圖表:一種分支圖,可以看清項目合并情況

描述:就是commit的message

送出:送出生成的hash碼

作者:誰送出的,這個團隊配合作用救命掀了

真正的複雜的項目,上一張圖,讓大家感受下:

15分鐘學會使用Git

分支情況會特别的複雜,感受下。

ST确實用圖形界面把Git的操作簡化到十分優雅的地步

Git送出代碼的流程,已經描述完畢

是不是十分簡單

------------------越是喧嚣的世界,越需要甯靜的思考------------------

合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。

積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。