【學了就忘】Git操作 — 48.Git存儲

1、什么是Git存儲

有時當你在項目的一個分支上挟阻,已經工作一段時間后呵恢,所有東西都進入了混亂的狀態(tài)驻民, 而這時你想要切換到另一個分支做一點別的事情。 問題是文虏,你不想僅僅因為這點別的事瞒瘸,而把剛剛做了一半的工作進行一次提交坷备。

針對這個問題,可以使用 git stash 命令來解決挨务。(stash:貯藏)

git stash 命令會處理工作目錄的臟狀態(tài)击你,即:根據(jù)文件的修改與暫存的改動,然后將未完成的修改保存到一個棧上谎柄, 而你可以在任何時候重新應用這些改動(甚至在不同的分支上)丁侄。

2、Git存儲的常用命令

  1. git stash朝巫、git stash push鸿摇、git stash save:保存當前工作進度,會把暫存區(qū)和工作區(qū)的改動stash(保存)起來劈猿。執(zhí)行完這個命令后拙吉,在運行git status命令潮孽,就會發(fā)現(xiàn)當前工作目錄中有一個干凈的工作區(qū),沒有任何改動筷黔。

    使用git stash save '注釋'可以給存儲的進度添加注釋往史。

  2. git stash list:顯示Git存儲棧中的進度列表。

  3. git stash pop [–index] [stash_id]:Git存儲棧會把工作區(qū)和暫存區(qū)的改動都恢復到工作區(qū)佛舱,通過git stash pop命令恢復進度后椎例,同時會刪除Git存儲棧中當前進度的存儲。

    1)git stash pop命令:如果不指定请祖,Git會把最近一次的Git存儲恢復到工作區(qū)订歪。

    2)git stash pop --index命令:恢復最新的Git存儲到工作區(qū)和暫存區(qū),嘗試將原來暫存區(qū)的改動肆捕,恢復到暫存區(qū)刷晋。

    3)git stash pop [stash_id]命令:恢復指定的進度到工作區(qū)。stash_id是通過git stash list命令得到的慎陵。例如:stash@{1}眼虱。

  4. git stash apply [–index] [stash_id]:不刪除恢復的Git存儲,其余和git stash pop命令一樣荆姆。

  5. git stash drop [stash_id]:刪除一個存儲的進度蒙幻。如果不指定stash_id,則默認刪除最新的存儲進度胆筒。

  6. git stash clear:刪除所有存儲的進度。

  7. git stash show:顯示stash的內容具體是什么诈豌,使用方法如 git stash show stash@{0}仆救。

  8. git stash branch <branchname> <stash>:基于進度創(chuàng)建分支。

說明:

當我們執(zhí)行git stash apply之后矫渔,發(fā)現(xiàn)所有的文件都變成了未暫存的彤蔽,如果想維持原來的樣子,也就是暫存過的依舊是暫存狀態(tài)庙洼,那么可以使用 git stash apply --index命令顿痪。

即:--index選項作用,除了恢復工作區(qū)的文件外油够,還嘗試恢復暫存區(qū)蚁袭。

拓展:截至 2017 年 10 月下旬,Git 郵件列表上進行了廣泛討論石咬,該討論中棄用了 git stash save 命令揩悄, 代之以現(xiàn)有的 git stash push 命令。主因是 git stash push 引入了貯藏選定的 路徑規(guī)范 的選項鬼悠, 而有些東西 git stash save 不支持删性。

git stash save 不會很快就消失亏娜,所以不用擔心它突然不見。

3蹬挺、常用參數(shù)說明

  1. -k:即--keep-index參數(shù):

    在保存進度后维贺,不會將暫存區(qū)重置。默認會將暫存區(qū)和工作區(qū)強制重置巴帮。

  2. --patch:會顯示工作區(qū)和HEAD的差異幸缕。通過對差異文件的編輯,決定在進度中晰韵,最終要保存的发乔,工作區(qū)的內容。通過編輯差異文件雪猪,可以在進度中排除無關內容栏尚。

  3. -u:即--include-untracked參數(shù):

    默認情況下,git stash 只會存儲已修改和暫存的 已跟蹤 文件只恨。 如果指定 --include-untracked-u 選項译仗,Git 也會存儲任何未跟蹤文件。

    然而在Git存儲中官觅,包含未跟蹤的文件中纵菌,仍然不會包含明確 忽略 的文件。 要額外包含忽略的文件休涤,請使用 --all-a 選項咱圆。

4、Git存儲演示

現(xiàn)在本地版本庫中情況如下:

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git log --oneline
4f69dbb (HEAD -> dev) 第3次提交功氨,在dev分支新增stash.txt文件
89e03bd (master) 第2次提交序苏,readme.txt文件,v2版本
80add2e 第1次提交捷凄,新增readme.txt文件

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git reflog
4f69dbb (HEAD -> dev) HEAD@{1}: commit: 第3次提交忱详,在dev分支新增stash.txt文件
89e03bd (master) HEAD@{2}: checkout: moving from master to dev
89e03bd (master) HEAD@{3}: commit: 第2次提交,readme.txt文件跺涤,v2版本
80add2e HEAD@{4}: commit (initial): 第1次提交匈睁,新增readme.txt文件

有兩分支,master分支和dev分支桶错。

此時正在開發(fā)dev分支中的stash.txt文件航唆。

下面開始演示 git stash 命令用法。

1)從未完成工作dev分支牛曹,切換到master工作佛点。

# 1.開發(fā)dev分支中的stash.txt文件。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ echo "stash.txt v2" >> stash.txt

# 2.查看工作目錄中文件狀態(tài)
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git status
On branch dev
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   stash.txt

no changes added to commit (use "git add" and/or "git commit -a")

# 3.切換到master分支處理事情
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        stash.txt
Please commit your changes or stash them before you switch branches.
Aborting

# 發(fā)現(xiàn)此時切換分支失敗,讓你在切換分支之前超营,先提交更改或存儲更改鸳玩。
# 下面我們進行存儲更改

# 4.現(xiàn)在想要切換分支,但是還不想要提交之前的修改工作演闭,所以存儲修改不跟。 
# 將新的Git存儲推送到棧上,運行 git stash 或 git stash push
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash
warning: LF will be replaced by CRLF in stash.txt.
The file will have its original line endings in your working directory
Saved working directory and index state WIP on dev: 4f69dbb 第3次提交米碰,在dev分支新增stash.txt文件

# 5.查看Git存儲棧中的內容窝革,可以看到一條Git存儲內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash list
stash@{0}: WIP on dev: 4f69dbb 第3次提交,在dev分支新增stash.txt文件

# 6.再次查看工作目錄中文件狀態(tài)吕座,可以看到工作目錄是干凈的虐译,就可以進行分支切換了。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git status
On branch dev
nothing to commit, working tree clean

# 7.此時我們先來查看一下歷史提交記錄的變化
# 沒有變化
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git log --oneline 
4f69dbb (HEAD -> dev) 第3次提交吴趴,在dev分支新增stash.txt文件
89e03bd (master) 第2次提交漆诽,readme.txt文件,v2版本
80add2e 第1次提交锣枝,新增readme.txt文件

# 此時提交歷史多了一條HEAD移動記錄厢拭,但是commit-id沒有變化。(知道就行了)
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git reflog
4f69dbb (HEAD -> dev) HEAD@{0}: reset: moving to HEAD
4f69dbb (HEAD -> dev) HEAD@{1}: commit: 第3次提交撇叁,在dev分支新增stash.txt文件
89e03bd (master) HEAD@{2}: checkout: moving from master to dev
89e03bd (master) HEAD@{3}: commit: 第2次提交供鸠,readme.txt文件,v2版本
80add2e HEAD@{4}: commit (initial): 第1次提交陨闹,新增readme.txt文件


# 7.切換到master分支楞捂。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git checkout master
Switched to branch 'master'

2)在master分支工作完成之后,在切換回dev分支正林。

# 1.在master分支泡一,查看Git存儲棧中的內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (master)
$ git stash list
stash@{0}: WIP on dev: 4f69dbb 第3次提交,在dev分支新增stash.txt文件

# 我們可以看到在master分支中觅廓,也能看到Git存儲棧中的內容。
# 就說明Git存儲棧中的內容可以在不同的分支使用涵但。
# 這里就不在master分支使用了

# 2.切換到dev分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (master)
$ git status
On branch master
nothing to commit, working tree clean

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (master)
$ git checkout dev
Switched to branch 'dev'

# 可以看到此時dev分支的工作目錄是干凈的杈绸。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git status
On branch dev
nothing to commit, working tree clean

# 3.把Git存儲棧中的內容進行恢復
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash list
stash@{0}: WIP on dev: 4f69dbb 第3次提交,在dev分支新增stash.txt文件

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash apply stash@{0}
On branch dev
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   stash.txt

no changes added to commit (use "git add" and/or "git commit -a")

# 4.查看stash.txt文件內容矮瘟,可以看到內容恢復了
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ cat stash.txt
stash.txt v1
stash.txt v2

3)刪除Git存儲棧中的內容

# 1.查看Git存儲棧中的內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash list
stash@{0}: WIP on dev: 4f69dbb 第3次提交瞳脓,在dev分支新增stash.txt文件

# 我們可以看到Git存儲棧中的內容,不會自動刪除澈侠,是需要手動進行刪除的劫侧。

# 2.刪除Git存儲棧中的內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash drop stash@{0}
Dropped stash@{0} (00e9eb7b2ae3d1264656e75161b7c3f83b034282)

# 3.再次查看Git存儲棧中的內容,可以看到沒有任何存儲的內容了。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/gitstash (dev)
$ git stash list

在工作中通常使用git stash pop命令烧栋,代替git stash applygit stash drop命令写妥。

一般我們在實際工作中,不要把這個Git存儲棧弄得很復雜审姓,只建議存儲一個元素珍特,用完就刪除。

參考:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末魔吐,一起剝皮案震驚了整個濱河市扎筒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酬姆,老刑警劉巖嗜桌,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辞色,居然都是意外死亡骨宠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門淫僻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱篷,“玉大人,你說我怎么就攤上這事雳灵∽厮” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵悯辙,是天一觀的道長琳省。 經常有香客問我,道長躲撰,這世上最難降的妖魔是什么针贬? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拢蛋,結果婚禮上桦他,老公的妹妹穿的比我還像新娘。我一直安慰自己谆棱,他們只是感情好快压,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垃瞧,像睡著了一般蔫劣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上个从,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天脉幢,我揣著相機與錄音歪沃,去河邊找鬼。 笑死嫌松,一個胖子當著我的面吹牛沪曙,可吹牛的內容都是我干的。 我是一名探鬼主播豆瘫,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼珊蟀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了外驱?” 一聲冷哼從身側響起育灸,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昵宇,沒想到半個月后磅崭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦哎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年砸喻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒋譬。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡割岛,死狀恐怖,靈堂內的尸體忽然破棺而出犯助,到底是詐尸還是另有隱情癣漆,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布剂买,位于F島的核電站惠爽,受9級特大地震影響,放射性物質發(fā)生泄漏瞬哼。R本人自食惡果不足惜婚肆,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坐慰。 院中可真熱鬧较性,春花似錦、人聲如沸结胀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽把跨。三九已至,卻和暖如春沼死,著一層夾襖步出監(jiān)牢的瞬間着逐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耸别,地道東北人健芭。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像秀姐,于是被迫代替她去往敵國和親慈迈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容