Git Command (Chapter 1) - git checkout

在軟件開發(fā)過程中,Git是一種服務(wù)于項目版本管理的重要工具故硅,世界上各個開源項目倉庫諸如Github均使用git進行代碼倉庫的操作蘑险。
一般地,有兩種途徑來使用Git工具决乎,一種是第三方開發(fā)的交互式界面軟件队询,另一種則是直接使用命令行指令。使用Git交互式界面軟件來操作代碼倉庫构诚,好處是操作簡單直觀蚌斩,學(xué)習(xí)成本低。而本文的主旨在于從代碼層面上了解Git工具的操作原理范嘱,做到知其然知且其所以然送膳,遇到相關(guān)問題能夠找到正確的方法進行解決,故僅對命令行進行使用說明詳述丑蛤。

使用前須知

“The three trees” - “三棵樹”

在使用Git指令之前叠聋,各位小伙伴須將一概念熟記于心,這個概念被稱作“The three trees”受裹。下面我們用一張圖來進行理解:

圖1 The three trees
  • Working Directory - 工作目錄
    即項目所在文件夾碌补,也就是你的項目根目錄。

  • Staged Snapshot - 臨時快照
    即當(dāng)你對Working Directory中的文件進行了任何CRUD操作棉饶,并且對這些操作執(zhí)行了git add命令厦章,此時這些文件便進入到了Staged狀態(tài)。進入到Staged狀態(tài)的文件照藻,即可以進行commit操作進入到Commit History袜啃,也可以進行reset操作回退到Unstaged狀態(tài)。下面用兩張圖來進行理解:

圖2 Working Directory

上圖中岩梳,對Working Directory中的www文件進行了修改囊骤,執(zhí)行g(shù)it status可以看到,www進入了git的檢測列表冀值,狀態(tài)為Unstaged也物。此時,我們再執(zhí)行git add .列疗,得到下圖結(jié)果滑蚯,此時,www進入到了Staged Snapshot中:

圖3 Staged Snapshot
  • Commit History
    即已提交歷史,對項目的任何修改已被提交到本地倉庫中告材,該記錄已進入到提交歷史中坤次,可通過git log進行查詢。下圖為提交后結(jié)果:
圖4 Commit History

注意:完成commit操作不等同于push到遠程分支斥赋,并不會對遠程分支造成任何影響缰猴,同時pullpush以及分支概念不在本文的研究范圍中疤剑,故不做贅述滑绒。

Scope - 作用范圍

作用范圍也是Git使用中必須要掌握的一個概念,所謂作用范圍隘膘,是指Git指令所起作用的兩種對象(層級)疑故,分別是File-level和Commit-level。就之前的圖2為例弯菊,當(dāng)www文件被修改之后纵势,此時可對該修改文件進行2種操作,一種是git add使其進入到Staged Snapshot中管钳,另一種則是git checkout令其還原到修改前的狀態(tài)钦铁。

  • File-level
    文件層級為Git指令對單個或者多個文件(指令中反映為文件路徑)進行的操作,git checkout蹋嵌、git reset均可作用于該層級育瓜。

注意:git revert沒有File Scope操作。

  • Commit-level
    提交層級為Git指令對Commit History中的單條或多條commit進行的操作栽烂,git checkout躏仇、git resetgit revert均可作用于該層級腺办。下面附上三種指令對應(yīng)Scope的表格:
Git指令 作用范圍 常用場景
git checkout Commit-level 1. 分支間切換 2. 切換到同一分支下的指定commit進行代碼瀏覽(分離狀態(tài)焰手,下文會進一步闡述說明)
git checkout File-level 還原對某個或多個文件的修改(該操作不可逆,慎用)
git reset Commit-level 還原某一分支上已提交的某條或多條commits(適用于個人分支怀喉,該操作不可逆书妻,慎用)
git reset File-level 將Staged狀態(tài)下的某個或多個文件,還原到Unstaged狀態(tài)
git revert Commit-level 撤銷某分支上的已提交內(nèi)容(適用于公共分支)
git revert File-level 無文件層級操作

git checkout

分支切換

git checkout指令用于更新當(dāng)前項目所處狀態(tài)躬拢,若指令所指定的值為分支名躲履,則切換到該指定分支。例如聊闯,我們打算將當(dāng)前所處master分支工猜,切換到hotfix分支上,執(zhí)行如下代碼:

git checkout hotfix

此時菱蔬,若當(dāng)前分支上的修改可能對目標(biāo)分支上的文件造成覆寫篷帅,則Git會強制中斷此次操作史侣,并提示哪些文件可能導(dǎo)致覆寫,提出操作建議魏身。當(dāng)你完成修改后惊橱,即能夠進行成功切換,git checkout指令的執(zhí)行機制如下圖所示箭昵,其中税朴,HEAD可以理解為頭指針,用于指向當(dāng)前項目代碼所處的分支家制,以及commit history位置:

圖5 git checkout <branch>

切換前掉房,HEAD指向Master分支的最近一次代碼提交位置;切換后慰丛,HEAD指向Hotfix分支的最近一次代碼提交位置。

指定commit history位置切換

git checkout也可以用于切換到某一分支上的指定commit位置瘾杭,當(dāng)指令值為commit id時诅病,則能夠?qū)EAD指向該次commit,例如粥烁,我們想要將代碼回溯到上上一次commit位置進行快速瀏覽時贤笆,則可以運行以下指令:

git checkout HEAD~2

為了方便理解,下圖表示了此次指令的執(zhí)行機制:

圖6 git checkout <commit>

可以看到讨阻,執(zhí)行完畢后芥永,HEAD已經(jīng)指向了上上一次commit的位置。git checkout的這項特性使得用戶能夠快速地切換到目標(biāo)commit對代碼進行查閱钝吮,并且不會對當(dāng)前分支造成任何影響埋涧,此時HEAD指向的代碼位置不屬于任何一個分支的任何一次commit,這樣的狀態(tài)叫做'detached HEAD' state奇瘦,執(zhí)行結(jié)果見下圖所示:

圖7 git checkout <commit>執(zhí)行結(jié)果

需要注意的是棘催,處于detached HEAD狀態(tài)的代碼,在你切換到任何分支后耳标,都會丟失得不到保存醇坝,所以,如果你想要在該commit上進行修改并提交次坡,請務(wù)必在修改前執(zhí)行git checkout -b <new-branch-name>呼猪,這樣,你可以得到一個同該commit代碼一模一樣的新分支砸琅,并進行任何能夠得到記錄的操作宋距。

還原Unstaged狀態(tài)的文件

git checkout還能夠作用于Unstaged狀態(tài)下的文件,執(zhí)行后明棍,該文件的任何修改都會還原到此次修改前的狀態(tài)乡革,這種場景常見于當(dāng)你進行了某些實驗性質(zhì)的修改或者因某些原因需要放棄此次修改時。執(zhí)行指令如下:

git checkout -- <single file path> // 還原單個文件
git checkout -- . // 還原所有此次修改文件

本章完。
下一章節(jié)將主要介紹git reset指令沸版。
文中部分圖片源于www.atlassian.com嘁傀。

參考文獻

https://git-scm.com/docs/git-checkout
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市视粮,隨后出現(xiàn)的幾起案子细办,更是在濱河造成了極大的恐慌,老刑警劉巖蕾殴,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笑撞,死亡現(xiàn)場離奇詭異,居然都是意外死亡钓觉,警方通過查閱死者的電腦和手機茴肥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荡灾,“玉大人瓤狐,你說我怎么就攤上這事∨希” “怎么了础锐?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荧缘。 經(jīng)常有香客問我皆警,道長,這世上最難降的妖魔是什么截粗? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任信姓,我火速辦了婚禮,結(jié)果婚禮上绸罗,老公的妹妹穿的比我還像新娘财破。我一直安慰自己,他們只是感情好从诲,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布左痢。 她就那樣靜靜地躺著,像睡著了一般系洛。 火紅的嫁衣襯著肌膚如雪俊性。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天描扯,我揣著相機與錄音定页,去河邊找鬼。 笑死绽诚,一個胖子當(dāng)著我的面吹牛典徊,可吹牛的內(nèi)容都是我干的杭煎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼卒落,長吁一口氣:“原來是場噩夢啊……” “哼羡铲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起儡毕,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤也切,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腰湾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雷恃,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年费坊,在試婚紗的時候發(fā)現(xiàn)自己被綠了倒槐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡附井,死狀恐怖导犹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羡忘,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布磕昼,位于F島的核電站卷雕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏票从。R本人自食惡果不足惜漫雕,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峰鄙。 院中可真熱鬧浸间,春花似錦、人聲如沸吟榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吩翻。三九已至兜看,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狭瞎,已是汗流浹背细移。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熊锭,地道東北人弧轧。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓雪侥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親精绎。 傳聞我的和親對象是個殘疾皇子速缨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來捺典。這樣一來鸟廓,任何一處協(xié)同...
    __silhouette閱讀 15,874評論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,913評論 0 11
  • 今天是年二十九襟己,媽媽生日引谜。好幾天前,媽媽就說:一直都沒去市里逛過花市擎浴,今天我們?nèi)ス浠ㄊ性毖剩妹矗课耶?dāng)然說贮预,好贝室。盡管每...
    魚海棠閱讀 109評論 0 0
  • 大地一片空曠 野火在遠處悄然流放 黑暗籠罩著整個村莊 千萬只魔獸在暗夜隱藏 輕蔑的笑聲在疾風(fēng)中游蕩 騎士默默端平了...
    二靜不二閱讀 274評論 3 4
  • 隨著社會的需求以及多樣化進步,培養(yǎng)孩子學(xué)習(xí)才藝已經(jīng)成為一種普遍現(xiàn)象仿吞。 有些孩子通過一段時間地學(xué)習(xí)滑频,能夠讓才藝大放光...
    播予閱讀 1,336評論 0 3