15分鐘學(xué)會(huì)使用Git

作者:Mark24

郵箱:mark.zhangyoung@qq.com

時(shí)間:2015.07.28

開頭扯扯淡

(想看干貨的跳過這段–>直奔干貨)

個(gè)人也走了很多的彎路學(xué)習(xí)Git

幸運(yùn)的是,彎路走的比較少,在Git上只浪費(fèi)了5天

可是我見過許多人,浪費(fèi)了可能更久

標(biāo)題起個(gè)15分鐘是個(gè)噱頭

拋下那些迂腐不堪的書本

類似《Git Pro》,《Git權(quán)威指南》,《Git社區(qū)手冊(cè)》的那些

我打賭,看那些看得越久,你只會(huì)覺得Git越難用,并且用過SVN的同學(xué),還會(huì)吐槽Git設(shè)計(jì)的復(fù)雜

雖然我不是大牛,但是我站在用戶的角度,非常想吐槽Git

Git設(shè)計(jì)的就是很爛

為毛說他爛?

上圖來說明一切

下圖是SVN的操作邏輯:

主線傻子都能看明白,就是圖中心的三條線:

Checkout:克隆項(xiàng)目

Commit:提交本地代碼

Update:更新本地代碼?

圖下面三個(gè)線:

add:添加項(xiàng)目

rm:刪除項(xiàng)目

revert:撤銷?

所以我站在用戶的角度,SVN的設(shè)計(jì)是清晰的

個(gè)人覺得是設(shè)計(jì)的典范

本來嘛

軟件的設(shè)計(jì)除了功能性

還要設(shè)計(jì)本身就是美的

下面來看看Git

上圖!

下面是Git的操作流程:

說點(diǎn)通俗點(diǎn),設(shè)計(jì)的就是一坨狗屎,完全找不到規(guī)律

要我說Linux社區(qū)宗教性十足,被追捧的大神……

但是往往盛名之下,其實(shí)難副

這玩意就是

東一磚頭,西一磚頭蓋起來的

我在懷疑有沒有設(shè)計(jì)過!

順便吐槽

自己也做web開發(fā)

JS這門語(yǔ)言設(shè)計(jì)的最爛

隨著越了解JS,越感覺JS設(shè)計(jì)的爛

JS的語(yǔ)法之混雜,糅雜了C,Java …的各種語(yǔ)法

實(shí)在和小而美的Python沒法比?

JS和Git一樣

都是沒有用心設(shè)計(jì)過的產(chǎn)物

得過且過,功能為上的產(chǎn)物

所以,學(xué)習(xí)語(yǔ)言,也要了解他們的脾氣和品行?

Python你可以用數(shù)學(xué)的邏輯去推理去學(xué)習(xí),往往可以舉一反三,因?yàn)樵O(shè)計(jì)邏輯就在那里

JS 呵呵……自己慢慢走遍所有的坑吧?

后來我知道JS是10天設(shè)計(jì)出來了……我只能呵呵,說明我的語(yǔ)言感還是挺準(zhǔn)的

Git核心功能設(shè)計(jì)出來,用時(shí)也不長(zhǎng),可能一周,具體的忘了?

總之,我們不能迷信權(quán)威

說了這么多,只想說

Git設(shè)計(jì)的都這么爛

你在看他的命令行設(shè)計(jì)的

我靠

簡(jiǎn)直就是隨意?

所以說,別用命令行了,不能在樹上吊死

這就是為什么可以15分鐘速成,因?yàn)槲覀兏静挥媚莻€(gè)坑爹的命令

15分鐘掌握Git

先說怎么個(gè)15分鐘法?

首先呢,我會(huì)給出Git的工作流程圖?

然后我會(huì)簡(jiǎn)單的解釋一下,Git的基本概念和工作流程

對(duì)Git完全沒概念的同學(xué),可以看看?

然后我們用一個(gè)更高級(jí)的,直觀的工具,完成所有想做的事情

而這一切,不需要去挨個(gè)挨個(gè)敲指令

幾乎可以找到每個(gè)常用的境況?

然后重點(diǎn)來了

重點(diǎn)來了

重點(diǎn)來了?

重要的事情說三遍?

用一個(gè)叫做Source Tree的軟件

安裝核心的git

再安裝一個(gè)足夠好的圖形界面客戶端

這就是我的方案?

先別吐槽

我會(huì)告訴你用Source Tree而不是用別的?

Git本身的Windows上的客戶端,爛的不堪,直接忽略?

TortoiseGit這種設(shè)計(jì)爛的軟件?

我都懶得推薦

個(gè)人把它拉入黑名單

推薦大家也別用了

界面丑也就算了,基本上反直覺

在圖形化如此發(fā)達(dá)的今天,這種軟件竟然還存在

這些也就算了,反正開源軟件,界面質(zhì)量都不高

但是問題,這個(gè)軟件刷新率不高

當(dāng)你用Sublime打開文件的時(shí)候,然后最小化,用TortoiseGit來pull最新代碼

Sublime是不會(huì)刷新的

還有TortoiseGit簡(jiǎn)化了Git的模型,取消了暫存區(qū)的概念

不想多說了

你會(huì)偶爾出現(xiàn),照著書上,用TortoiseGit操作哦,結(jié)果出現(xiàn)錯(cuò)誤

反正不管怎么樣吧

我就被TortoiseGit給搞的暈頭轉(zhuǎn)向之后就棄用了

Source Tree是個(gè)好東西?

來說說Git是咋么一回事

現(xiàn)在祭上圖

咱們挨個(gè)挨個(gè)解釋一下

最好把這張圖,單獨(dú)開在一個(gè)窗口,對(duì)照著,下面就來解釋這個(gè)圖?

首先看這張圖中間,四個(gè)圓柱?

Workspace:工作區(qū),就是你正在寫的代碼

index:暫存區(qū),一個(gè)本地的緩沖區(qū)

local repository:本地倉(cāng)庫(kù)

remote repository:遠(yuǎn)程倉(cāng)庫(kù)?

先來講講術(shù)語(yǔ)

寫代碼,寫完了保存,這是一般文件的流程

Git多加了一個(gè)流程,就是保存后,你要提交

Git會(huì)追蹤你每次保存,和上次保存之間的差別??

然后把這些信息,保存在一個(gè)文件夾下,文件夾名叫.git

這個(gè)文件夾叫做倉(cāng)庫(kù),用倉(cāng)庫(kù)可以追蹤代碼,看到每次改變了什么,可以還原到以前的狀態(tài),也可以看別人改了什么,這就是代碼版本控制的本質(zhì),一種高級(jí)的保存功能,自帶時(shí)光機(jī)的那種

Workspace工作區(qū)

就是你正在寫的代碼,正在打開的編輯器里面的內(nèi)容,解釋完了,就這樣?

index暫存區(qū)

index照理應(yīng)該翻譯叫索引,這里叫暫存區(qū)

暫存區(qū)是干嘛的?

暫存區(qū)是Git和SVN的最重要的差別之一

我們來看圖,箭頭就是代碼流動(dòng)的方向?

Git的流程工作流程就是:

眼前正在寫的代碼(workspace)覺得差不多了

add命令

提交到暫存區(qū)(index)類似于保存一下

然后你可以返回正在寫的代碼(workspace)繼續(xù)寫,寫的到了一個(gè)階段了

add命令

又提交到了暫存區(qū)(index)?

對(duì)就是這樣子工作的!?

舉一反三!!

舉一反三?。?/p>

重要的事情說三遍,舉一反三?

當(dāng)你多次提交,基本工作完成的差不多了

按照道理

你應(yīng)該每次都add到了index暫存區(qū)?

現(xiàn)在好了,任務(wù)完成

要把暫存區(qū)里的東西,放到本地倉(cāng)庫(kù)(local repository)?

使用commit命令?

大家看圖應(yīng)該注意到

worksp –> local repository

有一個(gè)綠色的箭頭 commit -a

這條命令

就是同時(shí)完成,把當(dāng)前的修改,提交到暫存區(qū),然后把暫存區(qū)的提交到

本地倉(cāng)庫(kù)?

Git每次提交的,都是保存變化的改動(dòng),不是簡(jiǎn)簡(jiǎn)單單的復(fù)制一遍?

本地倉(cāng)庫(kù)(local repository)

就是正式的代碼保存的地方?

如果你本地所有的內(nèi)容都被commit到本地倉(cāng)庫(kù)了

表示你已經(jīng)很滿意所有的代碼

并且完成了所有的編寫?

這個(gè)時(shí)候,你想把代碼上傳到Github或者公司的Git服務(wù)器,提交給別人

看圖

local repository –> remote repository

中間是push操作?

想對(duì)你正在工作的電腦,你電腦叫l(wèi)ocal,本地

網(wǎng)絡(luò)上的,就叫remote,遠(yuǎn)程?

remote repository 遠(yuǎn)程倉(cāng)庫(kù)

就是網(wǎng)絡(luò)上的倉(cāng)庫(kù)

一般是放在網(wǎng)絡(luò)上保存

或者和團(tuán)隊(duì)一起配合著干活

網(wǎng)絡(luò)倉(cāng)庫(kù)就成為一個(gè)中樞的感覺?

我們看圖的上半部分

提交的過程,按照箭頭,由下往上:?

remote repository:遠(yuǎn)程倉(cāng)庫(kù)

^

|

| push:就是“推”,把本地的正式的提交代碼,推到網(wǎng)絡(luò)上

|

local repository:本地倉(cāng)庫(kù)

^

|

| commit:合并多次修改,提交到倉(cāng)庫(kù)保存

|

index :暫存區(qū)

^

|

| add:一段階段的代碼,保存

|

Workspace:正在寫代碼,寫的不錯(cuò)了?

再來看看這張圖的下三路?

remote repository –> workspace?

這里有一個(gè)pull 黃顏色的,操作(rebase后面講)

pull就是“拉”的意思,拉動(dòng),把網(wǎng)絡(luò)的代碼,拉動(dòng)到本地

拉動(dòng)的目標(biāo)是workspace,就是你正在寫的代碼?

解釋一下這里,比如你正在寫代碼,或者打開了一個(gè)項(xiàng)目

編輯器Sublime Text上代碼顯示出來了,表示文件打開了

這個(gè)時(shí)候,公司的小明告訴你,公司昨天幾位同事加班加點(diǎn),代碼更新了

讓你更新一下代碼,以獲得人家工作一晚上加班的工作成果

你這個(gè)時(shí)候就要pull,拉取最新的代碼,以保證自己和大家的工作進(jìn)度一致

pull的意義在于,執(zhí)行完操作,會(huì)刷新你的編輯器

Sublime Text上的代碼,會(huì)變化到最新的代碼

不信你試試?

TortoiseGit來pull的時(shí)候,編輯器刷新與否,似乎看心情 = =b?

下面來看紅色,紅色的兩個(gè)箭頭

最左邊有一個(gè)小字

revert

意思大概是反轉(zhuǎn),撤銷的意思?

對(duì)啊,你光提交,萬(wàn)一提交錯(cuò)了呢?

Git里有一套撤銷的機(jī)制

撤銷的機(jī)制尤其復(fù)雜

這里引用一篇文章戳這里

不過那些都不是我們要說的重點(diǎn)

學(xué)習(xí)嘛,要抓住主干,細(xì)枝末節(jié)的,晚點(diǎn)再說,又不一定全都遇上

Git復(fù)雜的就可能是撤消了,這些我們暫時(shí)不管?

下面還有兩路灰色的,左邊的說明是compare

就是可以比較你每次修改的代碼和之前的代碼有什么區(qū)別

這是Git最重要的作用,就是可以看到每次提交的不同?

這些也不說,放在后面說?

現(xiàn)在主要的就是把上三路和pull熟悉?

小結(jié)

【工作區(qū)】->add->【暫存區(qū)】->commit->【本地倉(cāng)庫(kù)】->push->【遠(yuǎn)程倉(cāng)庫(kù)】?

【工作區(qū)】<------------------ pull ----------------- 【遠(yuǎn)程倉(cāng)庫(kù)】

記?。?/p>

add、commit、push、pull?

可愛的Source Tree

Source Tree是一個(gè)優(yōu)秀的,直覺式的Git的圖形界面客戶端

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

基本上所有常用場(chǎng)景下,都可以勝任,如果實(shí)在情況特殊,使用命令行?

下面是Source Tree界面

Source Tree的設(shè)計(jì)符合直覺

這張圖上面的圖標(biāo),基本上是所有常用的操作了

Clone/New:Clone就是克隆,copy拷貝的另一種稱呼,這里意思是從遠(yuǎn)程倉(cāng)庫(kù),拷貝一個(gè)項(xiàng)目到本地?

Commit:大家一看就明白?

Checkout:沒講,簡(jiǎn)單的說,你保存了一個(gè)版本到暫存區(qū),然后繼續(xù)寫,寫著寫著后悔了,挨個(gè)挨個(gè)改回去太麻煩,checkout就是從暫存區(qū)的一個(gè)保存版本還原到正在寫的編輯器,這一點(diǎn),看第一地圖,紅色的短的checkout描述的就是這個(gè)意思(checkout HEAD后面講)?

Discard:丟棄?

Stash:保存你目前的所有狀態(tài),到一個(gè)特別的文件–>我個(gè)人覺得這個(gè)很常用,一會(huì)提到?

Add:把文件提到暫存區(qū)?

Fetch:看看地圖,遠(yuǎn)程倉(cāng)庫(kù)拉去到倉(cāng)庫(kù),目前打開的編輯器不會(huì)變化?

Pull:提過了?

Branch:分支,這個(gè)不講,一般項(xiàng)目負(fù)責(zé)人負(fù)責(zé)?

Merge: 合并分支,同上

覺得難記沒關(guān)系,SourceTree有中文界面可以挑

用英文,主要是和Git的命令,對(duì)應(yīng)起來,有助于找規(guī)律?

下面一個(gè)框區(qū),就是diff,比較代碼不同的地方

紅色是刪掉的,標(biāo)記為減號(hào)

綠色是添加的,標(biāo)記為加號(hào)?

Source Tree實(shí)時(shí)幫你顯示,所以diff這個(gè)命令壓根不需要你敲?

現(xiàn)在了解完畢Git的工作流程

現(xiàn)在讓我們用Source Tree走一遍

本篇文章就是在Github上建立的一個(gè)項(xiàng)目(如果不知道怎么做,輕查詢Github官方教程)

然后clone到本地

把項(xiàng)目添加到了Source Tree

把項(xiàng)目添加到Source Tree

下面簡(jiǎn)稱SourceTree為ST

然后用編輯器打開文件編輯,編輯完畢后,保存文件,這個(gè)一定要保存,然后可以把編輯器最小化了,然后可以看看ST

點(diǎn)擊如圖,第一步,工作副本

這個(gè)要經(jīng)常點(diǎn),只要你點(diǎn)了,切換就會(huì)刷新

稍微等一會(huì),第二部的地方,就會(huì)出現(xiàn)文件的修改狀態(tài)

第二部所在的區(qū)域,就是工作區(qū),就是你編輯器,編輯器的文件臨時(shí)狀態(tài),可以部分選,也可以全選,選擇后,會(huì)出現(xiàn)如下圖:

整個(gè)項(xiàng)目移動(dòng)到上面,就是暫存區(qū),右邊是Diff狀態(tài),表示你修改了什么

提交按鈕,就是Commit,點(diǎn)擊他,進(jìn)入下圖:

如圖會(huì)跳出一個(gè)commit信息,看過Git的同學(xué),應(yīng)該知道,每次commit都會(huì)讓你鍵入一個(gè)message,其實(shí)就是寫明,你做了什么,改了什么,這樣子等到回退,撤銷的時(shí)候,一看信息就明白了

下面有一個(gè)按鈕,和上面的推送是一樣的

可以先commit,然后push

如果倉(cāng)庫(kù)是配置好的?

按一下,就可以提交代碼了?

提交好代碼后,可以看到如圖:

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

右邊的字段:

圖表:一種分支圖,可以看清項(xiàng)目合并情況

描述:就是commit的message

提交:提交生成的hash碼

作者:誰(shuí)提交的,這個(gè)團(tuán)隊(duì)配合作用救命掀了

真正的復(fù)雜的項(xiàng)目,上一張圖,讓大家感受下:

分支情況會(huì)特別的復(fù)雜,感受下。

小結(jié)

ST確實(shí)用圖形界面把Git的操作簡(jiǎn)化到十分優(yōu)雅的地步

Git提交代碼的流程,已經(jīng)描述完畢

是不是十分簡(jiǎn)單

后記

明天有活干了

關(guān)于如何撤銷?

分支創(chuàng)建和合并?

還有團(tuán)隊(duì)合作策略(stash的應(yīng)用),如何避免沖突?

這個(gè)有空再寫

資源聲明:圖片來自于互聯(lián)網(wǎng)

版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證)

反饋

可以在issue中反饋,歡迎交流,共同進(jìn)步

贊助



贈(zèng)送2個(gè)學(xué)習(xí)git的網(wǎng)址:https://learngitbranching.js.org/?demo

https://unbug.github.io/codelf/


需要企業(yè)簽的,聯(lián)系QQ:807224386 ? ? 微信:wx807224386

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容