git reset soft,hard,mixed之區(qū)別深解

GIT reset命令锁保,似乎讓人很迷惑除抛,以至于誤解狮杨,誤用。但是事實上不應(yīng)該如此難以理解到忽,只要你理解到這個命令究竟在干什么橄教。

一、首先我們來看幾個術(shù)語:

(一) HEAD

這是當前分支版本頂端的別名喘漏,也就是在當前分支你最近的一個提交

(二) Index

index也被稱為staging area护蝶,是指一整套即將被下一個提交的文件集合。他也是將成為HEAD的父親的那個commit

(三) Working Copy

working copy代表你正在工作的那個文件集

(四) Flow

當你第一次checkout一個分支翩迈,HEAD就指向當前分支的最近一個commit持灰。在HEAD中的文件集(實際上他們從技術(shù)上不是文件,他們是blobs(一團)负饲,但是為了討論的方便我們就簡化認為他們就是一些文件)和在index中的文件集是相同的堤魁,在working copy的文件集和HEAD,INDEX中的文件集是完全相同的。所有三者(HEAD,INDEX(STAGING),WORKING COPY)都是相同的狀態(tài)返十,GIT很happy妥泉。
當你對一個文件執(zhí)行一次修改,Git感知到了這個修改洞坑,并且說:“嘿盲链,文件已經(jīng)變更了!你的working copy不再和index,head相同迟杂!”刽沾,隨后GIT標記這個文件是修改過的。
然后逢慌,當你執(zhí)行一個git add,它就stages the file in the index悠轩,并且GIT說:“嘿,OK攻泼,現(xiàn)在你的working copy和index區(qū)是相同的火架,但是他們和HEAD區(qū)是不同的鉴象!”
當你執(zhí)行一個git commit,GIT就創(chuàng)建一個新的commit,隨后HEAD就指向這個新的commit何鸡,而index,working copy的狀態(tài)和HEAD就又完全匹配相同了纺弊,GIT又一次HAPPY了。

下面這一段是另外一個牛人的解釋:

總的來說骡男,git reset命令是用來將當前branch重置到另外一個commit的淆游,而這個動作可能會將index以及work tree同樣影響。比如如果你的master branch(當前checked out)是下面這個樣子:

- A - B - C (HEAD, master)

HEAD和master branch tip是在一起的隔盛,而你希望將master指向到B犹菱,而不是C,那么你執(zhí)行

git reset B以便移動master branch到B那個commit:

- A - B (HEAD, master) # - C is still here, but there's no branch pointing to it anymore

注意:git reset和checkout是不一樣的吮炕。如果你運行g(shù)it checkout B,那么你講得到:

- A - B (HEAD) - C (master)

這時HEAD和master branch就不在一個點上了腊脱,你進入detached HEAD STATE. HEAD,work tree,index都指向了B,但是master branch卻依然指向C龙亲。如果在這個點上陕凹,你執(zhí)行一個新的commit D,那么你講得到下面(當然這可能并不是你想要的鳄炉,你可能想要的是創(chuàng)一個branch做bug fix):

- A - B - C (master) \ D (HEAD)

記住git reset不會產(chǎn)生commits,它僅僅更新一個branch(branch本身就是一個指向一個commit的指針)指向另外一個commit(Head和branch Tip同時移動保持一致).其他的僅剩對于index和work tree(working directory)有什么影響杜耙。git checkout xxxCommit則只影響HEAD,如果xxxCommit和一個branch tip是一致的話拂盯,則HEAD和branch相匹配佑女,如果xxxCommit并不和任何branch tip相一致,則git進入detached HEAD 狀態(tài)

(五) Reset

如果你仔細研究reset命令本身就知道磕仅,它本身做的事情就是重置HEAD(當前分支的版本頂端)到另外一個commit珊豹。假設(shè)我們有一個分支(名稱本身無所謂,所以我們就簡單稱為"super-duper-feature”分支吧)榕订,圖形化表示如下:


182225251979460.png

如果我們執(zhí)行:

git reset HEAD

任何事情都不會發(fā)生店茶,這是因為我們告訴GIT重置這個分支到HEAD,而這個正是它現(xiàn)在所在的位置劫恒。

git reset HEAD~1

當我們再執(zhí)行上面的命令時(HEAD~1是“the commit right before HEAD”的別名贩幻,或者說:put differently "HEAD's parent"),我們的分支將會如下所示:


182225251979460.png

如果我們執(zhí)行g(shù)it reset HEAD~2,則意味著將HEAD從頂端的commit往下移動兩個更早的commit两嘴。

(六) Parameters

  1. soft
    --soft參數(shù)告訴Git重置HEAD到另外一個commit丛楚,但也到此為止。如果你指定--soft參數(shù)憔辫,Git將停止在那里而什么也不會根本變化趣些。這意味著index,working copy都不會做任何變化,所有的在original HEAD和你重置到的那個commit之間的所有變更集都放在stage(index)區(qū)域中贰您。


    182225251979460.png

    如果我們執(zhí)行g(shù)it reset HEAD~2,則意味著將HEAD從頂端的commit往下移動兩個更早的commit坏平。

  2. hard
    --hard參數(shù)將會blow out everything.它將重置HEAD返回到另外一個commit(取決于~12的參數(shù))拢操,重置index以便反映HEAD的變化,并且重置working copy也使得其完全匹配起來舶替。這是一個比較危險的動作令境,具有破壞性,數(shù)據(jù)因此可能會丟失顾瞪!如果真是發(fā)生了數(shù)據(jù)丟失又希望找回來舔庶,那么只有使用:git reflog命令了。makes everything match the commit you have reset to.你的所有本地修改將丟失陈醒。如果我們希望徹底丟掉本地修改但是又不希望更改branch所指向的commit惕橙,則執(zhí)行g(shù)it reset --hard = git reset --hard HEAD. i.e. don't change the branch but get rid of all local changes.另外一個場景是簡單地移動branch從一個到另一個commit而保持index/work區(qū)域同步。這將確實令你丟失你的工作孵延,因為它將修改你的work tree吕漂!

    182225251979460.png

  3. mixed(default)
    --mixed是reset的默認參數(shù),也就是當你不指定任何參數(shù)時的參數(shù)尘应。它將重置HEAD到另外一個commit,并且重置index以便和HEAD相匹配,但是也到此為止吼虎。working copy不會被更改犬钢。所有該branch上從original HEAD(commit)到你重置到的那個commit之間的所有變更將作為local modifications保存在working area中,(被標示為local modification or untracked via git status)思灰,但是并未staged的狀態(tài)玷犹,你可以重新檢視然后再做修改和commit


    182225251979460.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洒疚,隨后出現(xiàn)的幾起案子歹颓,更是在濱河造成了極大的恐慌,老刑警劉巖油湖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍扛,死亡現(xiàn)場離奇詭異,居然都是意外死亡乏德,警方通過查閱死者的電腦和手機撤奸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊括,“玉大人胧瓜,你說我怎么就攤上這事≈J玻” “怎么了府喳?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘑拯。 經(jīng)常有香客問我钝满,道長肉津,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任舱沧,我火速辦了婚禮妹沙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熟吏。我一直安慰自己距糖,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布牵寺。 她就那樣靜靜地躺著悍引,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帽氓。 梳的紋絲不亂的頭發(fā)上趣斤,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音黎休,去河邊找鬼浓领。 笑死,一個胖子當著我的面吹牛势腮,可吹牛的內(nèi)容都是我干的联贩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捎拯,長吁一口氣:“原來是場噩夢啊……” “哼泪幌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署照,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祸泪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后建芙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體没隘,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年岁钓,在試婚紗的時候發(fā)現(xiàn)自己被綠了升略。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡屡限,死狀恐怖品嚣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钧大,我是刑警寧澤翰撑,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響眶诈,放射性物質(zhì)發(fā)生泄漏涨醋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一逝撬、第九天 我趴在偏房一處隱蔽的房頂上張望浴骂。 院中可真熱鬧,春花似錦宪潮、人聲如沸溯警。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯轻。三九已至,卻和暖如春尽棕,著一層夾襖步出監(jiān)牢的瞬間喳挑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工滔悉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伊诵,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓氧敢,卻偏偏與公主長得像日戈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子孙乖,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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

  • GIT reset命令,似乎讓人很迷惑份氧,以至于誤解唯袄,誤用。但是事實上不應(yīng)該如此難以理解蜗帜,只要你理解到這個命令究竟在...
    AsaGuo閱讀 1,722評論 0 1
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,491評論 1 26
  • 查閱了一些資料恋拷,站在前人的肩膀上,看世界會很美好的厅缺。而且事實證明蔬顾,如果英語好的話,基本學(xué)這個很快的湘捎,只要在git環(huán)...
    流著萬條永遠的河閱讀 23,176評論 3 4
  • 作者:蒸豆包 “是金子總會發(fā)光诀豁。”人們總覺得這句話是對的窥妇,但我不同意這句話舷胜。 從樂觀的角度來講,再...
    蒸豆包閱讀 371評論 0 0
  • 《相信每個人都有他自己的道理與難處》 張東輝活翩,焦點初級第43期堅持原創(chuàng)分享第7天2017.9.8 “每個人都有他自...
    星悅傳奇閱讀 231評論 0 0