應用場景:
1 當正在dev分支上開發某個項目,這時項目中出現一個bug,需要緊急修復,但是正在開發的內容只是完成一半,還不想提交,這時可以用git stash命令將修改的內容保存至堆棧區,然後順利切換到hotfix分支進行bug修復,修復完成後,再次切回到dev分支,從堆棧中恢復剛剛保存的內容。
2 由於疏忽,本應該在dev分支開發的內容,卻在master上進行了開發,需要重新切回到dev分支上進行開發,可以用git stash將內容保存至堆棧中,切回到dev分支後,再次恢復內容即可。
總的來說,git stash命令的作用就是將目前還不想提交的但是已經修改的內容進行保存至堆棧中,後續可以在某個分支上恢復出堆棧中的內容。這也就是說,stash中的內容不僅僅可以恢復到原先開發的分支,也可以恢復到其他任意指定的分支上。git stash作用的範圍包括工作區和暫存區中的內容,也就是說沒有提交的內容都會保存至堆棧中。
命令詳解:
1 git stash
能夠將所有未提交的修改(工作區和暫存區)保存至堆棧中,用於後續恢復當前工作目錄。
1 $ git status 2 On branch master 3 Changes not staged for commit: 4 (use "git add <file>..." to update what will be committed) 5 (use "git checkout -- <file>..." to discard changes in working directory) 6 7 modified: src/main/java/com/wy/CacheTest.java 8 modified: src/main/java/com/wy/StringTest.java 9 10 no changes added to commit (use "git add" and/or "git commit -a") 11 12 $ git stash 13 Saved working directory and index state WIP on master: b2f489c second 14 15 $ git status 16 On branch master 17 nothing to commit, working tree clean
2 git stash save
作用等同於git stash,區別是可以加一些註釋,如下:
git stash的效果:
1 stash@{0}: WIP on master: b2f489c second
git stash save “test1”的效果:
1 stash@{0}: On master: test1
3 git stash list
查看當前stash中的內容
4 git stash pop
將當前stash中的內容彈出,並應用到當前分支對應的工作目錄上。
注:該命令將堆棧中最近保存的內容刪除(棧是先進後出)
順序執行git stash save “test1”和git stash save “test2”命令,效果如下:
1 $ git stash list 2 stash@{0}: On master: test2 3 stash@{1}: On master: test1 4 5 $ git stash pop 6 On branch master 7 Changes not staged for commit: 8 (use "git add <file>..." to update what will be committed) 9 (use "git checkout -- <file>..." to discard changes in working directory) 10 11 modified: src/main/java/com/wy/StringTest.java 12 13 no changes added to commit (use "git add" and/or "git commit -a") 14 Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d) 15 16 $ git stash list 17 stash@{0}: On master: test1
可見,test2的stash是首先pop出來的。
如果從stash中恢復的內容和當前目錄中的內容發生了衝突,也就是說,恢復的內容和當前目錄修改了同一行的數據,那麼會提示報錯,需要解決衝突,可以通過創建新的分支來解決衝突。
5 git stash apply
將堆棧中的內容應用到當前目錄,不同於git stash pop,該命令不會將內容從堆棧中刪除,也就說該命令能夠將堆棧的內容多次應用到工作目錄中,適應於多個分支的情況。
1 $ git stash apply 2 On branch master 3 Changes not staged for commit: 4 (use "git add <file>..." to update what will be committed) 5 (use "git checkout -- <file>..." to discard changes in working directory) 6 7 modified: src/main/java/com/wy/StringTest.java 8 9 no changes added to commit (use "git add" and/or "git commit -a") 10 11 $ git stash list 12 stash@{0}: On master: test2 13 stash@{1}: On master: test1
堆棧中的內容並沒有刪除。
可以使用git stash apply + stash名字(如stash@{1})指定恢復哪個stash到當前的工作目錄。
6 git stash drop + 名稱
從堆棧中移除某個指定的stash
7 git stash clear
清除堆棧中的所有 內容
8 git stash show
查看堆棧中最新保存的stash和當前目錄的差異。
1 $ git stash show 2 src/main/java/com/wy/StringTest.java | 2 +- 3 1 file changed, 1 insertion(+), 1 deletion(-)
git stash show stash@{1}查看指定的stash和當前目錄差異。
通過 git stash show -p 查看詳細的不同:
1 $ git stash show -p 2 diff --git a/src/main/java/com/wy/CacheTest.java b/src/main/java/com/wy/CacheTest.java 3 index 6e90837..de0e47b 100644 4 --- a/src/main/java/com/wy/CacheTest.java 5 +++ b/src/main/java/com/wy/CacheTest.java 6 @@ -7,6 +7,6 @@ package com.wy; 7 */ 8 public class CacheTest { 9 public static void main(String[] args) { 10 - System.out.println("git stash test"); 11 + System.out.println("git stash test1"); 12 } 13 } 14 diff --git a/src/main/java/com/wy/StringTest.java b/src/main/java/com/wy/StringTest.java 15 index a7e146c..711d63f 100644 16 --- a/src/main/java/com/wy/StringTest.java 17 +++ b/src/main/java/com/wy/StringTest.java 18 @@ -12,7 +12,7 @@ public class StringTest { 19 20 @Test 21 public void test1() { 22 - System.out.println("================="); 23 + System.out.println("git stash test1"); 24 System.out.println(Strings.isNullOrEmpty(""));//true 25 System.out.println(Strings.isNullOrEmpty(" "));//false 26 System.out.println(Strings.nullToEmpty(null));//""
同樣,通過git stash show stash@{1} -p查看指定的stash的差異內容。
9 git stash branch
從最新的stash創建分支。
應用場景:當儲藏了部分工作,暫時不去理會,繼續在當前分支進行開發,後續想將stash中的內容恢復到當前工作目錄時,如果是針對同一個文件的修改(即便不是同行數據),那麼可能會發生衝突,恢復失敗,這裏通過創建新的分支來解決。可以用於解決stash中的內容和當前目錄的內容發生衝突的情景。
發生衝突時,需手動解決衝突。
PS:本文感謝 https://blog.csdn.net/stone_yw/article/details/80795669 的分享