1. 程式人生 > >git stash詳解 -----mark

git stash詳解 -----mark

git stash詳解

2018年06月24日 23:00:55 淹不死的水 閱讀數:1782 標籤: gitgit stash 更多

個人分類: git

應用場景:

1 當正在dev分支上開發某個專案,這時專案中出現一個bug,需要緊急修復,但是正在開發的內容只是完成一半,還不想提交,這時可以用git stash命令將修改的內容儲存至堆疊區,然後順利切換到hotfix分支進行bug修復,修復完成後,再次切回到dev分支,從堆疊中恢復剛剛儲存的內容。 
2 由於疏忽,本應該在dev分支開發的內容,卻在master上進行了開發,需要重新切回到dev分支上進行開發,可以用git stash將內容儲存至堆疊中,切回到dev分支後,再次恢復內容即可。 
總的來說,git stash命令的作用就是將目前還不想提交的但是已經修改的內容進行儲存至堆疊中,後續可以在某個分支上恢復出堆疊中的內容。這也就是說,stash中的內容不僅僅可以恢復到原先開發的分支,也可以恢復到其他任意指定的分支上。git stash作用的範圍包括工作區和暫存區中的內容,也就是說沒有提交的內容都會儲存至堆疊中。

命令詳解:

1 git stash

能夠將所有未提交的修改(工作區和暫存區)儲存至堆疊中,用於後續恢復當前工作目錄。

$ 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,區別是可以加一些註釋,如下: 
git stash的效果:

[email protected]{0}: WIP on master: b2f489c second

git stash save “test1”的效果:

[email protected]{0}: On master: test1

3 git stash list

檢視當前stash中的內容

4 git stash pop

將當前stash中的內容彈出,並應用到當前分支對應的工作目錄上。 
注:該命令將堆疊中最近儲存的內容刪除(棧是先進後出) 
順序執行git stash save “test1”和git stash save “test2”命令,效果如下:

$ git stash list
[email protected]{0}: On master: test2
[email protected]{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/[email protected]{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)

$ git stash list
[email protected]{0}: On master: test1

可見,test2的stash是首先pop出來的。 
如果從stash中恢復的內容和當前目錄中的內容發生了衝突,也就是說,恢復的內容和當前目錄修改了同一行的資料,那麼會提示報錯,需要解決衝突,可以通過建立新的分支來解決衝突。

5 git stash apply

將堆疊中的內容應用到當前目錄,不同於git stash pop,該命令不會將內容從堆疊中刪除,也就說該命令能夠將堆疊的內容多次應用到工作目錄中,適應於多個分支的情況。

$ 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
[email protected]{0}: On master: test2
[email protected]{1}: On master: test1

堆疊中的內容並沒有刪除。 
可以使用git stash apply + stash名字(如[email protected]{1})指定恢復哪個stash到當前的工作目錄。

6 git stash drop + 名稱

從堆疊中移除某個指定的stash

7 git stash clear

清除堆疊中的所有 內容

8 git stash show

檢視堆疊中最新儲存的stash和當前目錄的差異。

$ git stash show
 src/main/java/com/wy/StringTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

git stash show [email protected]{1}檢視指定的stash和當前目錄差異。 
通過 git stash show -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));//""

同樣,通過git stash show [email protected]{1} -p檢視指定的stash的差異內容。

9 git stash branch

從最新的stash建立分支。 
應用場景:當儲藏了部分工作,暫時不去理會,繼續在當前分支進行開發,後續想將stash中的內容恢復到當前工作目錄時,如果是針對同一個檔案的修改(即便不是同行資料),那麼可能會發生衝突,恢復失敗,這裡通過建立新的分支來解決。可以用於解決stash中的內容和當前目錄的內容發生衝突的情景。 
發生衝突時,需手動解決衝突。