一、應(yīng)用場景
1、 當(dāng)正在dev分支上開發(fā)某個項目,這時項目中出現(xiàn)一個bug,需要緊急修復(fù),但是正在開發(fā)的內(nèi)容只是完成一半,還不想提交,這時可以用git stash命令將修改的內(nèi)容保存至堆棧區(qū),然后順利切換到hotfix分支進(jìn)行bug修復(fù),修復(fù)完成后,再次切回到dev分支,從堆棧中恢復(fù)剛剛保存的內(nèi)容。
2 由于疏忽,本應(yīng)該在dev分支開發(fā)的內(nèi)容,卻在master上進(jìn)行了開發(fā),需要重新切回到dev分支上進(jìn)行開發(fā),可以用git stash將內(nèi)容保存至堆棧中,切回到dev分支后,再次恢復(fù)內(nèi)容即可。
總的來說,git stash命令的作用就是將目前還不想提交的但是已經(jīng)修改的內(nèi)容進(jìn)行保存至堆棧中,后續(xù)可以在某個分支上恢復(fù)出堆棧中的內(nèi)容。這也就是說,stash中的內(nèi)容不僅僅可以恢復(fù)到原先開發(fā)的分支,也可以恢復(fù)到其他任意指定的分支上。git stash作用的范圍包括工作區(qū)和暫存區(qū)中的內(nèi)容,也就是說沒有提交的內(nèi)容都會保存至堆棧中。
二、常用命令
1、git stash
能夠?qū)⑺形刺峤坏男薷模üぷ鲄^(qū)和暫存區(qū))保存至堆棧中,用于后續(xù)恢復(fù)當(dāng)前工作目錄。
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/main/java/com/wy/CacheTest.java
modified: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash
Saved working directory and index state WIP on master: b2f489c second
$ git status
On branch master
nothing to commit, working tree clean
2、git stash save
作用等同于git stash,區(qū)別是可以加一些注釋, 執(zhí)行存儲時,添加注釋,方便查找,如下:
git stash的效果:
stash@{0}: WIP on master: b2f489c second
git stash save “test1”的效果:
stash@{0}: On master: test1
3、git stash list
查看當(dāng)前stash中的內(nèi)容
4、git stash pop
將當(dāng)前stash中的內(nèi)容彈出,并應(yīng)用到當(dāng)前分支對應(yīng)的工作目錄上。
注:該命令將堆棧中最近保存的內(nèi)容刪除(棧是先進(jìn)后出)
順序執(zhí)行g(shù)it stash save “test1”和git stash save “test2”命令,效果如下:
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1
$ git stash pop
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)
$ git stash list
stash@{0}: On master: test1
如果要應(yīng)用并刪除其他stash,命令:git stash pop stash@{$num} ,比如應(yīng)用并刪除第二個:git stash pop stash@{1}
5、git stash apply
將堆棧中的內(nèi)容應(yīng)用到當(dāng)前目錄,默認(rèn)使用第一個存儲,即stash@{0},如果要使用其他個,git stash apply stash@{$num} , 比如第二個:git stash apply stash@{1}
不同于git stash pop,該命令不會將內(nèi)容從堆棧中刪除,也就說該命令能夠?qū)⒍褩5膬?nèi)容多次應(yīng)用到工作目錄中,適應(yīng)于多個分支的情況。
$ git stash apply
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1
6、git stash drop + 名稱
從堆棧中移除某個指定的stash
git stash drop stash@{num}存儲,從列表中刪除這個存儲
7、git stash clear
清除堆棧中的所有 內(nèi)容
8、git stash show
查看堆棧中最新保存的stash和當(dāng)前目錄的差異,顯示做了哪些改動,默認(rèn)show第一個存儲。
$ git stash show
src/main/java/com/wy/StringTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
,如果要顯示其他存貯,后面加stash@{$num},比如第二個 git stash show stash@{1}查看指定的stash和當(dāng)前目錄差異。
9、git stash show -p
顯示第一個存儲的改動詳情,如果想顯示其他存存儲,命令:git stash show stash@{$num} -p ,比如第二個:git stash show stash@{1} -p
$ git stash show -p
diff --git a/src/main/java/com/wy/CacheTest.java b/src/main/java/com/wy/CacheTest.java
index 6e90837..de0e47b 100644
--- a/src/main/java/com/wy/CacheTest.java
+++ b/src/main/java/com/wy/CacheTest.java
@@ -7,6 +7,6 @@ package com.wy;
*/
public class CacheTest {
public static void main(String[] args) {
- System.out.println("git stash test");
+ System.out.println("git stash test1");
}
}
diff --git a/src/main/java/com/wy/StringTest.java b/src/main/java/com/wy/StringTest.java
index a7e146c..711d63f 100644
--- a/src/main/java/com/wy/StringTest.java
+++ b/src/main/java/com/wy/StringTest.java
@@ -12,7 +12,7 @@ public class StringTest {
@Test
public void test1() {
- System.out.println("=================");
+ System.out.println("git stash test1");
System.out.println(Strings.isNullOrEmpty(""));//true
System.out.println(Strings.isNullOrEmpty(" "));//false
System.out.println(Strings.nullToEmpty(null));//""
10、git stash branch
從最新的stash創(chuàng)建分支。
應(yīng)用場景:當(dāng)儲藏了部分工作,暫時不去理會,繼續(xù)在當(dāng)前分支進(jìn)行開發(fā),后續(xù)想將stash中的內(nèi)容恢復(fù)到當(dāng)前工作目錄時,如果是針對同一個文件的修改(即便不是同行數(shù)據(jù)),那么可能會發(fā)生沖突,恢復(fù)失敗,這里通過創(chuàng)建新的分支來解決??梢杂糜诮鉀Qstash中的內(nèi)容和當(dāng)前目錄的內(nèi)容發(fā)生沖突的情景。
發(fā)生沖突時,需手動解決沖突。
三、其他
常規(guī) git stash 的一個限制是它會一下暫存所有的文件。有時,只備份某些文件更為方便,讓另外一些與代碼庫保持一致。一個非常有用的技巧,用來備份部分文件:
1、add 那些你不想備份的文件(例如: git add file1.js, file2.js)
2、調(diào)用 git stash –keep-index。只會備份那些沒有被add的文件。
3、調(diào)用 git reset 取消已經(jīng)add的文件的備份,繼續(xù)自己的工作。
參考鏈接:
https://blog.csdn.net/stone_yw/article/details/80795669
https://www.cnblogs.com/zndxall/archive/2018/09/04/9586088.html