一篇文章,教你學(xué)會(huì)Git

在日常工作中,經(jīng)常會(huì)用到Git操作。但是對(duì)于新人來講,剛上來對(duì)Git很陌生,操作起來也很懵逼。本篇文章主要針對(duì)剛開始接觸Git的新人,理解Git的基本原理,掌握常用的一些命令。

image

一、Git工作流程

image

以上包括一些簡(jiǎn)單而常用的命令,但是先不關(guān)心這些,先來了解下面這4個(gè)專有名詞。

Workspace:工作區(qū)

Index / Stage:暫存區(qū)

Repository:倉庫區(qū)(或本地倉庫)

Remote:遠(yuǎn)程倉庫

image

工作區(qū)

程序員進(jìn)行開發(fā)改動(dòng)的地方,是你當(dāng)前看到的,也是最新的。

平常我們開發(fā)就是拷貝遠(yuǎn)程倉庫中的一個(gè)分支,基于該分支進(jìn)行開發(fā)。在開發(fā)過程中就是對(duì)工作區(qū)的操作。

image

暫存區(qū)

.git目錄下的index文件, 暫存區(qū)會(huì)記錄git add添加文件的相關(guān)信息(文件名、大小、timestamp...),不保存文件實(shí)體, 通過id指向每個(gè)文件實(shí)體。可以使用git status查看暫存區(qū)的狀態(tài)。暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中,哪些內(nèi)容是被git管理的。

當(dāng)你完成某個(gè)需求或功能后需要提交到遠(yuǎn)程倉庫,那么第一步就是通過git add先提交到暫存區(qū),被git管理。

image

本地倉庫

保存了對(duì)象被提交 過的各個(gè)版本,比起工作區(qū)和暫存區(qū)的內(nèi)容,它要更舊一些。

git commit后同步index的目錄樹到本地倉庫,方便從下一步通過git push同步本地倉庫與遠(yuǎn)程倉庫的同步。

image

遠(yuǎn)程倉庫

遠(yuǎn)程倉庫的內(nèi)容可能被分布在多個(gè)地點(diǎn)的處于協(xié)作關(guān)系的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內(nèi)容是最舊的。

image

小結(jié)

1.任何對(duì)象都是在工作區(qū)中誕生和被修改;

2.任何修改都是從進(jìn)入index區(qū)才開始被版本控制;

3.只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕跡;

4.與協(xié)作者分享本地的修改,可以把它們push到遠(yuǎn)程倉庫來共享。

下面這幅圖更加直接闡述了四個(gè)區(qū)域之間的關(guān)系,可能有些命令不太清楚,沒關(guān)系,下部分會(huì)詳細(xì)介紹。

image
image

二、常用GIt命令

image

網(wǎng)上找了個(gè)圖,別人整理的一張圖,很全很好,借來用下。下面詳細(xì)解釋一些常用命令。

image

HEAD

image

在掌握具體命令前,先理解下HEAD。

HEAD,它始終指向當(dāng)前所處分支的最新的提交點(diǎn)。你所處的分支變化了,或者產(chǎn)生了新的提交點(diǎn),HEAD就會(huì)跟著改變。

image

add

image

add相關(guān)命令很簡(jiǎn)單,主要實(shí)現(xiàn)將工作區(qū)修改的內(nèi)容提交到暫存區(qū),交由git管理。

image
image

commit

image

commit相關(guān)命令也很簡(jiǎn)單,主要實(shí)現(xiàn)將暫存區(qū)的內(nèi)容提交到本地倉庫,并使得當(dāng)前分支的HEAD向后移動(dòng)一個(gè)提交點(diǎn)。

image
image

branch

image

涉及到協(xié)作,自然會(huì)涉及到分支,關(guān)于分支,大概有展示分支,切換分支,創(chuàng)建分支,刪除分支這四種操作。

image

關(guān)于分支的操作雖然比較多,但都比較簡(jiǎn)單好記。

image

merge

image

merge命令把不同的分支合并起來。如上圖,在實(shí)際開放中,我們可能從master分支中切出一個(gè)分支,然后進(jìn)行開發(fā)完成需求,中間經(jīng)過R3,R4,R5的commit記錄,最后開發(fā)完成需要合入master中,這便用到了merge。

image

一般在merge之后,會(huì)出現(xiàn)conflict,需要針對(duì)沖突情況,手動(dòng)解除沖突。主要是因?yàn)閮蓚€(gè)用戶修改了同一文件的同一塊區(qū)域。如下圖所示,需要手動(dòng)解除。

image
image

rebase

image

rebase又稱為衍合,是合并的另外一種選擇。

在開始階段,我們處于new分支上,執(zhí)行g(shù)it rebase dev,那么new分支上新的commit都在master分支上重演一遍,最后checkout切換回到new分支。這一點(diǎn)與merge是一樣的,合并前后所處的分支并沒有改變。git rebase dev,通俗的解釋就是new分支想站在dev的肩膀上繼續(xù)下去。rebase也需要手動(dòng)解決沖突。

image

rebase與merge的區(qū)別

現(xiàn)在我們有這樣的兩個(gè)分支,test和master,提交如下:

      D---E test     /A---B---C---F master

在master執(zhí)行g(shù)it merge test,然后會(huì)得到如下結(jié)果:

       D--------E     /          A---B---C---F----G   test, master

在master執(zhí)行g(shù)it rebase test,然后得到如下結(jié)果:

A---B---D---E---C'---F'   test, master

可以看到,merge操作會(huì)生成一個(gè)新的節(jié)點(diǎn),之前的提交分開顯示。而rebase操作不會(huì)生成新的節(jié)點(diǎn),是將兩個(gè)分支融合成一個(gè)線性的提交。

如果你想要一個(gè)干凈的,沒有merge commit的線性歷史樹,那么你應(yīng)該選擇git rebase
如果你想保留完整的歷史記錄,并且想要避免重寫commit history的風(fēng)險(xiǎn),你應(yīng)該選擇使用git merge

image

reset

image

reset命令把當(dāng)前分支指向另一個(gè)位置,并且相應(yīng)的變動(dòng)工作區(qū)和暫存區(qū)。

image
image

revert

image

git revert用一個(gè)新提交來消除一個(gè)歷史提交所做的任何修改。

image

revert與reset的區(qū)別

image

git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。

在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時(shí)有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時(shí),導(dǎo)致這部分改變不會(huì)再次出現(xiàn),減少?zèng)_突。但是git reset是之間把某些commit在某個(gè)branch上刪除,因而和老的branch再次merge時(shí),這些被回滾的commit應(yīng)該還會(huì)被引入,產(chǎn)生很多沖突。

git reset 是把HEAD向后移動(dòng)了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。

image

push

上傳本地倉庫分支到遠(yuǎn)程倉庫分支,實(shí)現(xiàn)同步。

image
image

其他命令

image

以上就是關(guān)于Git的一些常用命令及詳細(xì)闡述,相信能對(duì)Git有一個(gè)初步的認(rèn)識(shí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,346評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,558評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,739評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,980評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,347評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,702評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容