git stash詳解

應(yīng)用場(chǎng)景:

1 當(dāng)正在dev分支上開發(fā)某個(gè)項(xiàng)目,這時(shí)項(xiàng)目中出現(xiàn)一個(gè)bug,需要緊急修復(fù),但是正在開發(fā)的內(nèi)容只是完成一半,還不想提交,這時(shí)可以用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ù)可以在某個(gè)分支上恢復(fù)出堆棧中的內(nèi)容。這也就是說,stash中的內(nèi)容不僅僅可以恢復(fù)到原先開發(fā)的分支,也可以恢復(fù)到其他任意指定的分支上。git stash作用的范圍包括工作區(qū)和暫存區(qū)中的內(nèi)容,也就是說沒有提交的內(nèi)容都會(huì)保存至堆棧中。

命令詳解:

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ū)別是可以加一些注釋,如下:
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)前分支對(duì)應(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

可見,test2的stash是首先pop出來的。
如果從stash中恢復(fù)的內(nèi)容和當(dāng)前目錄中的內(nèi)容發(fā)生了沖突,也就是說,恢復(fù)的內(nèi)容和當(dāng)前目錄修改了同一行的數(shù)據(jù),那么會(huì)提示報(bào)錯(cuò),需要解決沖突,可以通過創(chuàng)建新的分支來解決沖突。

5 git stash apply

將堆棧中的內(nèi)容應(yīng)用到當(dāng)前目錄,不同于git stash pop,該命令不會(huì)將內(nèi)容從堆棧中刪除,也就說該命令能夠?qū)⒍褩5膬?nèi)容多次應(yīng)用到工作目錄中,適應(yīng)于多個(gè)分支的情況。

$ 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

堆棧中的內(nèi)容并沒有刪除。
可以使用git stash apply + stash名字(如stash@{1})指定恢復(fù)哪個(gè)stash到當(dāng)前的工作目錄。

6 git stash drop + 名稱

從堆棧中移除某個(gè)指定的stash

7 git stash clear

清除堆棧中的所有 內(nèi)容

8 git stash show

查看堆棧中最新保存的stash和當(dāng)前目錄的差異。

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

git stash show stash@{1}查看指定的stash和當(dāng)前目錄差異。
通過 git stash show -p 查看詳細(xì)的不同:

$ 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 stash@{1} -p查看指定的stash的差異內(nèi)容。

9 git stash branch

從最新的stash創(chuàng)建分支。
應(yīng)用場(chǎng)景:當(dāng)儲(chǔ)藏了部分工作,暫時(shí)不去理會(huì),繼續(xù)在當(dāng)前分支進(jìn)行開發(fā),后續(xù)想將stash中的內(nèi)容恢復(fù)到當(dāng)前工作目錄時(shí),如果是針對(duì)同一個(gè)文件的修改(即便不是同行數(shù)據(jù)),那么可能會(huì)發(fā)生沖突,恢復(fù)失敗,這里通過創(chuàng)建新的分支來解決??梢杂糜诮鉀Qstash中的內(nèi)容和當(dāng)前目錄的內(nèi)容發(fā)生沖突的情景。
發(fā)生沖突時(shí),需手動(dòng)解決沖突。
————————————————
版權(quán)聲明:本文為CSDN博主「淹不死的水」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/stone_yw/article/details/80795669

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一:Git是什么? Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 二:SVN與Git的最主要的區(qū)別? SVN是集...
    Splendid飛羽閱讀 358評(píng)論 0 0
  • 一:Git是什么? Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 二:SVN與Git的最主要的區(qū)別? SVN是集...
    像敏銳的狗閱讀 964評(píng)論 0 0
  • 如何關(guān)聯(lián)遠(yuǎn)程庫? 1.新建本地庫 2.通過git官網(wǎng)新建遠(yuǎn)程庫 3.輸入指令: git remote add or...
    諸子大人閱讀 17,512評(píng)論 1 9
  • 一:Git是什么? Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。 二:SVN與Git的最主要的區(qū)別? SVN是集...
    毛子阿卡西閱讀 287評(píng)論 0 1
  • 一:Git是什么?Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。二:SVN與Git的最主要的區(qū)別?SVN是集中式版...
    彭晉閱讀 350評(píng)論 0 1

友情鏈接更多精彩內(nèi)容