1、什么是Git存儲
有時當你在項目的一個分支上挟阻,已經工作一段時間后呵恢,所有東西都進入了混亂的狀態(tài)驻民, 而這時你想要切換到另一個分支做一點別的事情。 問題是文虏,你不想僅僅因為這點別的事瞒瘸,而把剛剛做了一半的工作進行一次提交坷备。
針對這個問題,可以使用 git stash
命令來解決挨务。(stash:貯藏)
git stash
命令會處理工作目錄的臟狀態(tài)击你,即:根據(jù)文件的修改與暫存的改動,然后將未完成的修改保存到一個棧上谎柄, 而你可以在任何時候重新應用這些改動(甚至在不同的分支上)丁侄。
2、Git存儲的常用命令
-
git stash
朝巫、git stash push
鸿摇、git stash save
:保存當前工作進度,會把暫存區(qū)和工作區(qū)的改動stash(保存)起來劈猿。執(zhí)行完這個命令后拙吉,在運行git status
命令潮孽,就會發(fā)現(xiàn)當前工作目錄中有一個干凈的工作區(qū),沒有任何改動筷黔。使用
git stash save '注釋'
可以給存儲的進度添加注釋往史。 git stash list
:顯示Git存儲棧中的進度列表。-
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}
眼虱。 git stash apply [–index] [stash_id]
:不刪除恢復的Git存儲,其余和git stash pop
命令一樣荆姆。git stash drop [stash_id]
:刪除一個存儲的進度蒙幻。如果不指定stash_id,則默認刪除最新的存儲進度胆筒。git stash clear
:刪除所有存儲的進度。git stash show
:顯示stash的內容具體是什么诈豌,使用方法如git stash show stash@{0}
仆救。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ù)說明
-
-k
:即--keep-index
參數(shù):在保存進度后维贺,不會將暫存區(qū)重置。默認會將暫存區(qū)和工作區(qū)強制重置巴帮。
--patch
:會顯示工作區(qū)和HEAD的差異幸缕。通過對差異文件的編輯,決定在進度中晰韵,最終要保存的发乔,工作區(qū)的內容。通過編輯差異文件雪猪,可以在進度中排除無關內容栏尚。-
-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 apply
和git stash drop
命令写妥。
一般我們在實際工作中,不要把這個Git存儲棧弄得很復雜审姓,只建議存儲一個元素珍特,用完就刪除。
參考: