作者: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這門語言設(shè)計(jì)的最爛
隨著越了解JS,越感覺JS設(shè)計(jì)的爛
JS的語法之混雜忌怎,糅雜了C籍滴,Java …的各種語法
實(shí)在和小而美的Python沒法比?
JS和Git一樣
都是沒有用心設(shè)計(jì)過的產(chǎn)物
得過且過,功能為上的產(chǎn)物
所以榴啸,學(xué)習(xí)語言孽惰,也要了解他們的脾氣和品行?
Python你可以用數(shù)學(xué)的邏輯去推理去學(xué)習(xí),往往可以舉一反三鸥印,因?yàn)樵O(shè)計(jì)邏輯就在那里
JS 呵呵……自己慢慢走遍所有的坑吧?
后來我知道JS是10天設(shè)計(jì)出來了……我只能呵呵勋功,說明我的語言感還是挺準(zhǔn)的
Git核心功能設(shè)計(jì)出來坦报,用時(shí)也不長,可能一周狂鞋,具體的忘了?
總之片择,我們不能迷信權(quán)威
說了這么多,只想說
Git設(shè)計(jì)的都這么爛
你在看他的命令行設(shè)計(jì)的
我靠
簡直就是隨意?
所以說骚揍,別用命令行了字管,不能在樹上吊死
這就是為什么可以15分鐘速成,因?yàn)槲覀兏静挥媚莻€(gè)坑爹的命令
先說怎么個(gè)15分鐘法?
首先呢信不,我會(huì)給出Git的工作流程圖?
然后我會(huì)簡單的解釋一下嘲叔,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簡化了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:本地倉庫
remote repository:遠(yuǎn)程倉庫?
先來講講術(shù)語
寫代碼暗甥,寫完了保存,這是一般文件的流程
Git多加了一個(gè)流程捉捅,就是保存后撤防,你要提交
Git會(huì)追蹤你每次保存,和上次保存之間的差別??
然后把這些信息棒口,保存在一個(gè)文件夾下即碗,文件夾名叫.git
這個(gè)文件夾叫做倉庫焰情,用倉庫可以追蹤代碼陌凳,看到每次改變了什么剥懒,可以還原到以前的狀態(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ì)就是這樣子工作的!?
舉一反三L肝旅挤!
舉一反三!伞鲫!
重要的事情說三遍粘茄,舉一反三?
當(dāng)你多次提交,基本工作完成的差不多了
按照道理
你應(yīng)該每次都add到了index暫存區(qū)?
現(xiàn)在好了秕脓,任務(wù)完成
要把暫存區(qū)里的東西柒瓣,放到本地倉庫(local repository)?
使用commit命令?
大家看圖應(yīng)該注意到
worksp –> local repository
有一個(gè)綠色的箭頭 commit -a
這條命令
就是同時(shí)完成,把當(dāng)前的修改吠架,提交到暫存區(qū)芙贫,然后把暫存區(qū)的提交到
本地倉庫?
Git每次提交的,都是保存變化的改動(dòng)诵肛,不是簡簡單單的復(fù)制一遍?
就是正式的代碼保存的地方?
如果你本地所有的內(nèi)容都被commit到本地倉庫了
表示你已經(jīng)很滿意所有的代碼
并且完成了所有的編寫?
這個(gè)時(shí)候屹培,你想把代碼上傳到Github或者公司的Git服務(wù)器,提交給別人
看圖
local repository –> remote repository
中間是push操作?
想對(duì)你正在工作的電腦怔檩,你電腦叫l(wèi)ocal褪秀,本地
網(wǎng)絡(luò)上的,就叫remote薛训,遠(yuǎn)程?
就是網(wǎng)絡(luò)上的倉庫
一般是放在網(wǎng)絡(luò)上保存
或者和團(tuán)隊(duì)一起配合著干活
網(wǎng)絡(luò)倉庫就成為一個(gè)中樞的感覺?
我們看圖的上半部分
提交的過程媒吗,按照箭頭,由下往上:?
remote repository:遠(yuǎn)程倉庫
^
|
| push:就是“推”乙埃,把本地的正式的提交代碼闸英,推到網(wǎng)絡(luò)上
|
local repository:本地倉庫
^
|
| commit:合并多次修改锯岖,提交到倉庫保存
|
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ì)啊炼鞠,你光提交缘滥,萬一提交錯(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->【本地倉庫】->push->【遠(yuǎn)程倉庫】?
【工作區(qū)】<------------------ pull ----------------- 【遠(yuǎn)程倉庫】
記住:
add懂缕、commit允跑、push、pull?
Source Tree是一個(gè)優(yōu)秀的,直覺式的Git的圖形界面客戶端
Source Tree用了很優(yōu)雅的方式和直覺化的流程聋丝,讓你很優(yōu)雅的使用Git
基本上所有常用場景下索烹,都可以勝任,如果實(shí)在情況特殊弱睦,使用命令行?
下面是Source Tree界面
Source Tree的設(shè)計(jì)符合直覺
這張圖上面的圖標(biāo)百姓,基本上是所有常用的操作了
Clone/New:Clone就是克隆,copy拷貝的另一種稱呼每篷,這里意思是從遠(yuǎn)程倉庫瓣戚,拷貝一個(gè)項(xiàng)目到本地?
Commit:大家一看就明白?
Checkout:沒講,簡單的說焦读,你保存了一個(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)程倉庫拉去到倉庫阔逼,目前打開的編輯器不會(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
下面簡稱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
如果倉庫是配置好的?
按一下液肌,就可以提交代碼了?
提交好代碼后,可以看到如圖:
左邊的分支鸥滨,可以看到整體情況
右邊的字段:
圖表:一種分支圖嗦哆,可以看清項(xiàng)目合并情況
描述:就是commit的message
提交:提交生成的hash碼
作者:誰提交的,這個(gè)團(tuán)隊(duì)配合作用救命掀了
真正的復(fù)雜的項(xiàng)目婿滓,上一張圖老速,讓大家感受下:
分支情況會(huì)特別的復(fù)雜,感受下凸主。
ST確實(shí)用圖形界面把Git的操作簡化到十分優(yōu)雅的地步
Git提交代碼的流程橘券,已經(jīng)描述完畢
是不是十分簡單
明天有活干了
關(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