作者:Mark24

(想看干貨的跳過這段–>直奔干貨)
個(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è)坑爹的命令
先說怎么個(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è)好東西?
現(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ī)的那種
就是你正在寫的代碼,正在打開的編輯器里面的內(nèi)容,解釋完了,就這樣?
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熟悉?
【工作區(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是一個(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ù)雜,感受下。
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