Git的4個階段的撤銷更改

正文從這里開始

雖然 git 誕生距今已有 12 年之久紫新,網上各種關于 git 的介紹文章數(shù)不勝數(shù),但是依然有很多人(包括我自己在內)對于它的功能不能完全掌握李剖。以下的介紹只是基于我個人對于 git 的理解弊琴,并且可能生編硬造了一些不完全符合 git 說法的詞語。目的只是為了讓 git 通俗化杖爽,使初學者也能大概了解如何快速上手 git 敲董。同時,下面所有討論慰安,我們都假設只使用一個分支腋寨,也就是主分支 master 的情況,雖然這種作法并不符合 git 規(guī)范化焕,但是現(xiàn)實情況中絕大部分用戶是直接在 master 分支上進行工作的萄窜,所以在這里我們不去引入更加復雜的各種分支的情況,也不涉及標簽 tag 的操作撒桨,只講在最簡單的主分支上如何回退查刻。


正常情況下,我們的工作流就是 3 個步驟凤类,對應上圖中的 3 個箭頭線:

git add.把所有文件放入暫存區(qū)穗泵;

git commit -m "comment"? 把所有文件從暫存區(qū)提交進本地倉庫;

git push? ?把所有文件從本地倉庫推送進遠程倉庫谜疤。

4個區(qū)

git 之所以令人費解佃延,主要是它相比于 svn 等等傳統(tǒng)的版本管理工具,多引入了一個 暫存區(qū) ( Stage )的概念夷磕,就因為多了這一個概念履肃,而使很多人疑惑。其實坐桩,在初學者來說尺棋,每個區(qū)具體怎么工作的,我們完全不需要關心绵跷,而只要知道有這么 4 個區(qū)就夠了:

工作區(qū)( Working Area )

暫存區(qū)( Stage )

本地倉庫( Local Repository )

遠程倉庫( Remote Repository )


5種狀態(tài)

以上 4 個區(qū)膘螟,進入每一個區(qū)成功之后會產生一個狀態(tài),再加上最初始的一個狀態(tài)抖坪,一共是 5 種狀態(tài)萍鲸。以下我們把這 5 種狀態(tài)分別命名為:

未修改( Origin )

已修改( Modified )

已暫存( Staged )

已提交( Committed )

已推送( Pushed )


檢查修改

了解了基本概念之后,我們來談一談犯錯誤之后如何撤銷的問題擦俐。首先脊阴,我們要了解如何檢查這 3 個步驟當中每一個步驟修改了什么,然后才好判斷有沒有修改成功蚯瞧。檢查修改的二級命令都相同嘿期,都是 diff ,只是參數(shù)有所不同埋合。


1.已修改备徐,未暫存

git diff

首先,我們來看一下甚颂,如果我們只是簡單地在瀏覽器里保存了一下文件蜜猾,但是還沒有做 git add . 之前秀菱,我們如何檢查有哪些修改。我們先隨便拿一個文件來做一下實驗:



我們在文件開頭的第 2 行胡亂加了 4 個數(shù)字 1234 蹭睡,存盤衍菱,這時文件進入了 已修改 狀態(tài),但是還沒有進入 暫存區(qū) 肩豁,我們運行 git diff 脊串,結果如下:



2.已暫存,未提交

git diff--cached

現(xiàn)在我們把修改放入 暫存區(qū) 看一下清钥。先執(zhí)行 git add . 琼锋,然后執(zhí)行 git diff ,你會發(fā)現(xiàn)沒有任何結果:

這說明 git diff 這個命令只檢查我們的 工作區(qū) 和 暫存區(qū) 之間的差異祟昭,如果我們想看到 暫存區(qū) 和 本地倉庫 之間的差異缕坎,就需要加一個參數(shù) git diff —cached :




已提交,未推送

git diff master origin/master

現(xiàn)在从橘,我們把修改從 暫存區(qū) 提交到 本地倉庫 念赶,再看一下差異。先執(zhí)行 git commit 恰力,然后再執(zhí)行 git diff —cached 叉谜,沒有差異,執(zhí)行 git diff master origin/master 踩萎,可以看到差異:


在這里停局, master 就是你的 本地倉庫 ,而 origin/master 就是你的 遠程倉庫 香府, master 是主分支的意思董栽,因為我們都在主分支上工作,所以這里兩邊都是 master 企孩,而 origin 就代表遠程锭碳。


撤銷修改

了解清楚如何檢查各種修改之后,我們開始嘗試各種撤銷操作勿璃。



已修改擒抛,未暫存

如果我們只是在編輯器里修改了文件,但還沒有執(zhí)行 git add . 补疑,這時候我們的文件還在 工作區(qū) 歧沪,并沒有進入 暫存區(qū) ,我們可以用:

git checkout.

或者

git reset--hard

來進行撤銷操作莲组。


可以看到诊胞,在執(zhí)行完 git checkout . 之后,修改已被撤銷锹杈, git diff 沒有任何內容了撵孤。

git add . 的反義詞是 git checkout . 做完修改之后迈着,如果你想向前走一步,讓修改進入 暫存區(qū) 邪码,就執(zhí)行 git add . 寥假,如果你想向后退一步,撤銷剛才的修改霞扬,就執(zhí)行 git checkout . 。



已暫存枫振,未提交

你已經執(zhí)行了 git add . 喻圃,但還沒有執(zhí)行 git commit -m “comment” 。這時候你意識到了錯誤粪滤,想要撤銷斧拍,你可以執(zhí)行:

git reset

git checkout

或者

git reset--hard

git reset 只是把修改退回到了 git add . 之前的狀態(tài),也就是說文件本身還處于 已修改未暫存 狀態(tài)杖小,你如果想退回 未修改 狀態(tài)肆汹,還需要執(zhí)行 git checkout . 。

或許你已經注意到了予权,以上兩個步驟都可以用同一個命令 git reset —hard 來完成昂勉。是的,就是這個強大的命令扫腺,可以一步到位地把你的修改完全恢復到 未修改 的狀態(tài)岗照。



已提交,未推送

你的手太快笆环,你既執(zhí)行了 git add . 攒至,又執(zhí)行了 git commit ,這時候你的代碼已經進入了你的 本地倉庫 躁劣,然而你后悔了迫吐,怎么辦?不要著急账忘,還有辦法志膀。

git reset--hard origin/master

還是這個 git reset —hard 命令,只不過這次多了一個參數(shù) origin/master 闪萄,正如我們上面講過的梧却, origin/master 代表 遠程倉庫 ,既然你已經污染了你的 本地倉庫 败去,那么就從 遠程倉庫 把代碼取回來吧放航。



.已推送

很不幸,你的手實在是太快了圆裕,你既 git add 了广鳍,又 git commit 了荆几,并且還 git push 了,這時你的代碼已經進入 遠程倉庫 赊时。如果你想恢復的話吨铸,還好,由于你的 本地倉庫 和 遠程倉庫 是等價的祖秒,你只需要先恢復 本地倉庫 诞吱,再強制 push 到 遠程倉庫 就好了:

git reset--hard HEAD^

git push -f




總結

以上 4 種狀態(tài)的撤銷我們都用到了同一個命令 git reset —hard ,前 2 種狀態(tài)的用法甚至完全一樣竭缝,所以只要掌握了 git reset —hard 這個命令的用法房维,從此你再也不用擔心提交錯誤了。

參照于@前端早讀課?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末抬纸,一起剝皮案震驚了整個濱河市咙俩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湿故,老刑警劉巖阿趁,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坛猪,居然都是意外死亡脖阵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門砚哆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來独撇,“玉大人,你說我怎么就攤上這事躁锁》紫常” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵战转,是天一觀的道長搜立。 經常有香客問我,道長槐秧,這世上最難降的妖魔是什么啄踊? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮刁标,結果婚禮上颠通,老公的妹妹穿的比我還像新娘。我一直安慰自己膀懈,他們只是感情好顿锰,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般硼控。 火紅的嫁衣襯著肌膚如雪刘陶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天牢撼,我揣著相機與錄音匙隔,去河邊找鬼。 笑死熏版,一個胖子當著我的面吹牛纷责,可吹牛的內容都是我干的。 我是一名探鬼主播撼短,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碰逸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阔加?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤满钟,失蹤者是張志新(化名)和其女友劉穎胜榔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湃番,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡夭织,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吠撮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尊惰。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泥兰,靈堂內的尸體忽然破棺而出弄屡,到底是詐尸還是另有隱情,我是刑警寧澤鞋诗,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布膀捷,位于F島的核電站,受9級特大地震影響削彬,放射性物質發(fā)生泄漏全庸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一融痛、第九天 我趴在偏房一處隱蔽的房頂上張望壶笼。 院中可真熱鬧,春花似錦雁刷、人聲如沸覆劈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽墩崩。三九已至氓英,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹦筹,已是汗流浹背铝阐。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铐拐,地道東北人徘键。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像遍蟋,于是被迫代替她去往敵國和親吹害。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容