無標(biāo)題文章

Git圖解

BY 童仲毅(geeeeeeeeek@github)

這是一篇在原文基礎(chǔ)上演繹的文章郎笆。原作者Mark Lodato塞栅,譯者wych鸣奔。原文采用創(chuàng)用CC 姓名標(biāo)示-非商業(yè)性-相同方式分享3.0 美國(guó)授權(quán)條款授權(quán)虱痕。

此頁圖解git中的最常用命令身冀。如果你稍微理解git的工作原理钝尸,這篇文章能夠讓你理解的更透徹。

基本用法

enter image description here
enter image description here

上面的四條命令在工作目錄搂根、stage緩存(也叫做索引)和commit歷史之間復(fù)制文件珍促。

  • git add files 把工作目錄中的文件加入stage緩存
  • git commit 把stage緩存生成一次commit,并加入commit歷史
  • git reset -- files 撤銷最后一次git add files剩愧,你也可以用git reset 撤銷所有stage緩存文件
  • git checkout -- files 把文件從stage緩存復(fù)制到工作目錄猪叙,用來丟棄本地修改

你可以用 git reset -pgit checkout -pgit add -p進(jìn)入交互模式仁卷,也可以跳過stage緩存直接從commit歷史取出文件或者直接提交代碼穴翩。

enter image description here
enter image description here
  • git commit -a 相當(dāng)于運(yùn)行git add把所有當(dāng)前目錄下的文件加入stage緩存再運(yùn)行git commit
  • git commit files 進(jìn)行一次包含最后一次提交加上工作目錄中文件快照的提交锦积,并且文件被添加到stage緩存芒帕。
  • git checkout HEAD -- files 回滾到復(fù)制最后一次提交。

約定

后文中以下面的形式使用圖片:

enter image description here
enter image description here

綠色的5位字符表示提交的ID丰介,分別指向父節(jié)點(diǎn)背蟆。分支用橙色顯示鉴分,分別指向特定的提交。當(dāng)前分支由附在其上的HEAD標(biāo)識(shí)淆储。

這張圖片里顯示最后5次提交冠场,ed489是最新提交家浇。 master分支指向此次提交本砰,另一個(gè)maint分支指向祖父提交節(jié)點(diǎn)。

命令詳解

Diff

有許多種方法查看兩次提交之間的變動(dòng)钢悲,下面是其中一些例子点额。

enter image description here
enter image description here

Commit

提交時(shí),git用stage緩存中的文件創(chuàng)建一個(gè)新的提交莺琳,并把此時(shí)的節(jié)點(diǎn)設(shè)為父節(jié)點(diǎn)还棱。然后把當(dāng)前分支指向新的提交節(jié)點(diǎn)。下圖中惭等,當(dāng)前分支是master珍手。

在運(yùn)行命令之前,master指向ed489辞做,提交后琳要,master指向新的節(jié)點(diǎn)f0cec并以ed489作為父節(jié)點(diǎn)。

enter image description here
enter image description here

即便當(dāng)前分支是某次提交的祖父節(jié)點(diǎn)秤茅,git會(huì)同樣操作稚补。下圖中,在master分支的祖父節(jié)點(diǎn)maint分支進(jìn)行一次提交框喳,生成了1800b课幕。

這樣,maint分支就不再是master分支的祖父節(jié)點(diǎn)五垮。此時(shí)乍惊,merge 或者 rebase 是必須的。

enter image description here
enter image description here

如果想更改一次提交放仗,使用 git commit --amend润绎。git會(huì)使用與當(dāng)前提交相同的父節(jié)點(diǎn)進(jìn)行一次新提交,舊的提交會(huì)被取消匙监。

enter image description here
enter image description here

另一個(gè)例子是分離HEAD提交凡橱,在后面的章節(jié)中介紹。

Checkout

checkout命令用于從歷史提交(或者stage緩存)中拷貝文件到工作目錄亭姥,也可用于切換分支稼钩。

當(dāng)給定某個(gè)文件名(或者打開-p選項(xiàng),或者文件名和-p選項(xiàng)同時(shí)打開)時(shí)达罗,git會(huì)從指定的提交中拷貝文件到stage緩存和工作目錄坝撑。比如静秆,git checkout HEAD~ foo.c會(huì)將提交節(jié)點(diǎn)HEAD~(即當(dāng)前提交節(jié)點(diǎn)的父節(jié)點(diǎn))中的foo.c復(fù)制到工作目錄并且加到stage緩存中。如果命令中沒有指定提交節(jié)點(diǎn)巡李,則會(huì)從stage緩存中拷貝內(nèi)容抚笔。注意當(dāng)前分支不會(huì)發(fā)生變化。

enter image description here
enter image description here

當(dāng)不指定文件名侨拦,而是給出一個(gè)(本地)分支時(shí)殊橙,那么HEAD標(biāo)識(shí)會(huì)移動(dòng)到那個(gè)分支(也就是說,我們“切換”到那個(gè)分支了)狱从,然后stage緩存和工作目錄中的內(nèi)容會(huì)和HEAD對(duì)應(yīng)的提交節(jié)點(diǎn)一致膨蛮。新提交節(jié)點(diǎn)(下圖中的a47c3)中的所有文件都會(huì)被復(fù)制(到stage緩存和工作目錄中);只存在于老的提交節(jié)點(diǎn)(ed489)中的文件會(huì)被刪除季研;不屬于上述兩者的文件會(huì)被忽略敞葛,不受影響。

enter image description here
enter image description here

如果既沒有指定文件名与涡,也沒有指定分支名惹谐,而是一個(gè)標(biāo)簽、遠(yuǎn)程分支驼卖、SHA-1值或者是像master~3類似的東西氨肌,就得到一個(gè)匿名分支,稱作detached HEAD(被分離的HEAD標(biāo)識(shí))款慨。這樣可以很方便地在歷史版本之間互相切換儒飒。比如說你想要編譯1.6.6.1版本的git,你可以運(yùn)行git checkout v1.6.6.1(這是一個(gè)標(biāo)簽檩奠,而非分支名)桩了,編譯,安裝埠戳,然后切換回另一個(gè)分支井誉,比如說git checkout master。然而整胃,當(dāng)提交操作涉及到“分離的HEAD”時(shí)颗圣,其行為會(huì)略有不同,詳情見在下面屁使。

enter image description here
enter image description here

HEAD標(biāo)識(shí)處于分離狀態(tài)時(shí)的提交操作

當(dāng)HEAD處于分離狀態(tài)(不依附于任一分支)時(shí)在岂,提交操作可以正常進(jìn)行,但是不會(huì)更新任何已命名的分支蛮寂。你可以認(rèn)為這是在更新一個(gè)匿名分支蔽午。

enter image description here
enter image description here

一旦此后你切換到別的分支,比如說master酬蹋,那么這個(gè)提交節(jié)點(diǎn)(可能)再也不會(huì)被引用到及老,然后就會(huì)被丟棄掉了抽莱。注意這個(gè)命令之后就不會(huì)有東西引用2eecb

enter image description here
enter image description here

但是骄恶,如果你想保存這個(gè)狀態(tài)食铐,可以用命令git checkout -b name來創(chuàng)建一個(gè)新的分支。

enter image description here
enter image description here

Reset

reset命令把當(dāng)前分支指向另一個(gè)位置僧鲁,并且有選擇的變動(dòng)工作目錄和索引虐呻。也用來在從歷史commit歷史中復(fù)制文件到索引,而不動(dòng)工作目錄悔捶。

如果不給選項(xiàng)铃慷,那么當(dāng)前分支指向到那個(gè)提交单芜。如果用--hard選項(xiàng)蜕该,那么工作目錄也更新,如果用--soft選項(xiàng)洲鸠,那么都不變堂淡。

enter image description here
enter image description here

如果沒有給出提交點(diǎn)的版本號(hào),那么默認(rèn)用HEAD扒腕。這樣绢淀,分支指向不變,但是索引會(huì)回滾到最后一次提交瘾腰,如果用--hard選項(xiàng)皆的,工作目錄也同樣。

enter image description here
enter image description here

如果給了文件名(或者 -p選項(xiàng)), 那么工作效果和帶文件名的checkout差不多蹋盆,除了索引被更新费薄。

enter image description here
enter image description here

Merge

merge 命令把不同分支合并起來。合并前栖雾,索引必須和當(dāng)前提交相同楞抡。如果另一個(gè)分支是當(dāng)前提交的祖父節(jié)點(diǎn),那么合并命令將什么也不做析藕。

另一種情況是如果當(dāng)前提交是另一個(gè)分支的祖父節(jié)點(diǎn)召廷,就導(dǎo)致fast-forward合并。指向只是簡(jiǎn)單的移動(dòng)账胧,并生成一個(gè)新的提交竞慢。

enter image description here
enter image description here

否則就是一次真正的合并。默認(rèn)把當(dāng)前提交(ed489 如下所示)和另一個(gè)提交(33104)以及他們的共同祖父節(jié)點(diǎn)(b325c)進(jìn)行一次三方合并治泥。結(jié)果是先保存當(dāng)前目錄和索引筹煮,然后和父節(jié)點(diǎn)33104一起做一次新提交。

enter image description here
enter image description here

Cherry Pick

cherry-pick命令"復(fù)制"一個(gè)提交節(jié)點(diǎn)并在當(dāng)前分支做一次完全一樣的新提交车摄。

enter image description here
enter image description here

Rebase

rebase是合并命令的另一種選擇寺谤。合并把兩個(gè)父分支合并進(jìn)行一次提交仑鸥,提交歷史不是線性的。rebase在當(dāng)前分支上重演另一個(gè)分支的歷史变屁,提交歷史是線性的眼俊。

本質(zhì)上,這是線性化的自動(dòng)的 cherry-pick粟关。

enter image description here
enter image description here

上面的命令都在topic分支中進(jìn)行疮胖,而不是master分支,在master分支上重演闷板,并且把分支指向新的節(jié)點(diǎn)澎灸。注意舊提交沒有被引用,將被回收遮晚。

要限制回滾范圍性昭,使用--onto選項(xiàng)。下面的命令在master分支上重演當(dāng)前分支從169a6以來的最近幾個(gè)提交县遣,即2c33a糜颠。

enter image description here
enter image description here

同樣有git rebase --interactive讓你更方便的完成一些復(fù)雜操作,比如丟棄萧求、重排其兴、修改、合并提交夸政。

這篇文章是『git-recipes』的一部分元旬,點(diǎn)擊目錄查看所有章節(jié)。

如果你覺得文章對(duì)你有幫助守问,歡迎點(diǎn)擊右上角的Star:star2:或Fork:fork_and_knife:匀归。

如果你發(fā)現(xiàn)了錯(cuò)誤,或是想要加入?yún)f(xié)作酪碘,請(qǐng)參閱Wiki協(xié)作說明朋譬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兴垦,隨后出現(xiàn)的幾起案子徙赢,更是在濱河造成了極大的恐慌,老刑警劉巖探越,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狡赐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钦幔,警方通過查閱死者的電腦和手機(jī)枕屉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤氢,“玉大人搀擂,你說我怎么就攤上這事西潘。” “怎么了哨颂?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵喷市,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我威恼,道長(zhǎng)品姓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任箫措,我火速辦了婚禮腹备,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斤蔓。我一直安慰自己植酥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布附迷。 她就那樣靜靜地躺著惧互,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喇伯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天拨与,我揣著相機(jī)與錄音稻据,去河邊找鬼。 笑死买喧,一個(gè)胖子當(dāng)著我的面吹牛捻悯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淤毛,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼今缚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了低淡?” 一聲冷哼從身側(cè)響起姓言,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔗蹋,沒想到半個(gè)月后何荚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猪杭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年餐塘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皂吮。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戒傻,死狀恐怖税手,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情需纳,我是刑警寧澤冈止,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站候齿,受9級(jí)特大地震影響熙暴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慌盯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一周霉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亚皂,春花似錦俱箱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至禁漓,卻和暖如春跟衅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背播歼。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工伶跷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秘狞。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓叭莫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親烁试。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雇初,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 初始化配置 C代碼 收藏代碼 配置使用git倉庫的人員姓名 git config --global user.n...
    Yepku閱讀 134評(píng)論 0 0
  • http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.ht...
    yuditxj閱讀 167評(píng)論 0 0
  • git的一些基礎(chǔ)命令 Git常用命令 請(qǐng)確保已經(jīng)安裝里git客戶端 一般配置 git --version //查看...
    qwerer閱讀 293評(píng)論 0 0
  • 隨著我們的長(zhǎng)大“玩”竟然成了一個(gè)負(fù)面的詞匯。想想那些我們聽到的話語减响。不要老是玩耍靖诗,要好好學(xué)習(xí)。不要光想著玩兒辩蛋,要好...
    勤奮虎哥閱讀 425評(píng)論 0 1
  • 我在燃燒 燃燒~starting in my heart 我是黑暗里躲著默默抽泣的丑角 我慢慢的繞過 你剛經(jīng)過...
    流浪在閱讀 217評(píng)論 0 0