paulwong

          git-stash用法小結(jié)

          緣起

          今天在看一個(gè)bug,之前一個(gè)分支的版本是正常的,在新的分支上上加了很多日志沒(méi)找到原因,希望回溯到之前的版本,確定下從哪個(gè)提交引入的問(wèn)題,但是還不想把現(xiàn)在的修改提交,也不希望在Git上看到當(dāng)前修改的版本(帶有大量日志和調(diào)試信息)。因此呢,查查Git有沒(méi)有提供類(lèi)似功能,就找到了git stash的命令。

          綜合下網(wǎng)上的介紹和資料,git stash(git儲(chǔ)藏)可用于以下情形:

          • 發(fā)現(xiàn)有一個(gè)類(lèi)是多余的,想刪掉它又擔(dān)心以后需要查看它的代碼,想保存它但又不想增加一個(gè)臟的提交。這時(shí)就可以考慮git stash。
          • 使用git的時(shí)候,我們往往使用分支(branch)解決任務(wù)切換問(wèn)題,例如,我們往往會(huì)建一個(gè)自己的分支去修改和調(diào)試代碼, 如果別人或者自己發(fā)現(xiàn)原有的分支上有個(gè)不得不修改的bug,我們往往會(huì)把完成一半的代碼commit提交到本地倉(cāng)庫(kù),然后切換分支去修改bug,改好之后再切換回來(lái)。這樣的話往往log上會(huì)有大量不必要的記錄。其實(shí)如果我們不想提交完成一半或者不完善的代碼,但是卻不得不去修改一個(gè)緊急Bug,那么使用git stash就可以將你當(dāng)前未提交到本地(和服務(wù)器)的代碼推入到Git的棧中,這時(shí)候你的工作區(qū)間和上一次提交的內(nèi)容是完全一樣的,所以你可以放心的修Bug,等到修完Bug,提交到服務(wù)器上后,再使用git stash apply將以前一半的工作應(yīng)用回來(lái)。
          • 經(jīng)常有這樣的事情發(fā)生,當(dāng)你正在進(jìn)行項(xiàng)目中某一部分的工作,里面的東西處于一個(gè)比較雜亂的狀態(tài),而你想轉(zhuǎn)到其他分支上進(jìn)行一些工作。問(wèn)題是,你不想提交進(jìn)行了一半的工作,否則以后你無(wú)法回到這個(gè)工作點(diǎn)。解決這個(gè)問(wèn)題的辦法就是git stash命令。儲(chǔ)藏(stash)可以獲取你工作目錄的中間狀態(tài)——也就是你修改過(guò)的被追蹤的文件和暫存的變更——并將它保存到一個(gè)未完結(jié)變更的堆棧中,隨時(shí)可以重新應(yīng)用。

          git stash用法

          1. stash當(dāng)前修改

          git stash會(huì)把所有未提交的修改(包括暫存的和非暫存的)都保存起來(lái),用于后續(xù)恢復(fù)當(dāng)前工作目錄。
          比如下面的中間狀態(tài),通過(guò)git stash命令推送一個(gè)新的儲(chǔ)藏,當(dāng)前的工作目錄就干凈了。

          $ git status 
          On branch master
          Changes to be committed:

          new file: style.css

          Changes not staged for commit:

          modified: index.html

          $ git stash Saved working directory and index state WIP on master: 5002d47 our new homepage
          HEAD is now at 5002d47 our new homepage

          $ git status
          On branch master nothing to commit, working tree clean

          需要說(shuō)明一點(diǎn),stash是本地的,不會(huì)通過(guò)git push命令上傳到git server上。
          實(shí)際應(yīng)用中推薦給每個(gè)stash加一個(gè)message,用于記錄版本,使用git stash save取代git stash命令。示例如下:

          $ git stash save "test-cmd-stash" 
          Saved working directory and index state On autoswitch: test-cmd-stash
          HEAD 現(xiàn)在位于 296e8d4 remove unnecessary postion reset in onResume function
          $ git stash list
          stash@{0}: On autoswitch: test-cmd-stash

          2. 重新應(yīng)用緩存的stash

          可以通過(guò)git stash pop命令恢復(fù)之前緩存的工作目錄,輸出如下:

          $ git status 
          On branch master
          nothing to commit, working tree clean
          $ git stash pop
          On branch master
          Changes to be committed:
          new file: style.css

          Changes not staged for commit:
          modified: index.html
          Dropped refs/stash@{0} (32b3aa1d185dfe6d57b3c3cc3b32cbf3e380cc6a)

          這個(gè)指令將緩存堆棧中的第一個(gè)stash刪除,并將對(duì)應(yīng)修改應(yīng)用到當(dāng)前的工作目錄下。
          你也可以使用git stash apply命令,將緩存堆棧中的stash多次應(yīng)用到工作目錄中,但并不刪除stash拷貝。命令輸出如下:

          $ git stash apply 
          On branch master
          Changes to be committed:
          new file: style.css
          Changes not staged for commit:
          modified: index.html

          3. 查看現(xiàn)有stash

          可以使用git stash list命令,一個(gè)典型的輸出如下:

          $ git stash list 
          stash@{0}: WIP on master: 049d078 added the index file
          stash@{1}: WIP on master: c264051 Revert "added file_size"
          stash@{2}: WIP on master: 21d80a5 added number to log

          在使用git stash apply命令時(shí)可以通過(guò)名字指定使用哪個(gè)stash,默認(rèn)使用最近的stash(即stash@{0})。

          4. 移除stash

          可以使用git stash drop命令,后面可以跟著stash名字。下面是一個(gè)示例:

          $ git stash list 
          stash@{0}: WIP on master: 049d078 added the index file
          stash@{1}: WIP on master: c264051 Revert "added file_size"
          stash@{2}: WIP on master: 21d80a5 added number to log
          $ git stash drop stash@{0}
          Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)

          或者使用git stash clear命令,刪除所有緩存的stash。

          5. 查看指定stash的diff

          可以使用git stash show命令,后面可以跟著stash名字。示例如下:

          $ git stash show
          index.html | 1 +
          style.css | 3 +++
          2 files changed, 4 insertions(+)

          在該命令后面添加-p--patch可以查看特定stash的全部diff,如下:

          $ git stash show -p 
          diff --git a/style.css b/style.css
          new file mode 100644
          index 0000000..d92368b
          --- /dev/null
          +++ b/style.css @@ -0,0 +1,3 @@
          +* {
          + text-decoration: blink;
          +}
          diff --git a/index.html b/index.html
          index 9daeafb..ebdcbd2 100644
          --- a/index.html
          +++ b/index.html
          @@ -1 +1,2 @@
          +<link rel="stylesheet" href="style.css"/>

          6. 從stash創(chuàng)建分支

          如果你儲(chǔ)藏了一些工作,暫時(shí)不去理會(huì),然后繼續(xù)在你儲(chǔ)藏工作的分支上工作,你在重新應(yīng)用工作時(shí)可能會(huì)碰到一些問(wèn)題。如果嘗試應(yīng)用的變更是針對(duì)一個(gè)你那之后修改過(guò)的文件,你會(huì)碰到一個(gè)歸并沖突并且必須去化解它。如果你想用更方便的方法來(lái)重新檢驗(yàn)?zāi)銉?chǔ)藏的變更,你可以運(yùn)行 git stash branch,這會(huì)創(chuàng)建一個(gè)新的分支,檢出你儲(chǔ)藏工作時(shí)的所處的提交,重新應(yīng)用你的工作,如果成功,將會(huì)丟棄儲(chǔ)藏。

          $ git stash branch testchanges 
          Switched to a new branch "testchanges"
          # On branch testchanges
          # Changes to be committed:
          # (use "git reset HEAD <file>..." to unstage)
          #
          # modified: index.html
          #
          # Changes not staged for commit:
          # (use "git add <file>..." to update what will be committed)
          #
          # modified: lib/simplegit.rb
          #
          Dropped refs/stash@{0} (f0dfc4d5dc332d1cee34a634182e168c4efc3359)

          這是一個(gè)很棒的捷徑來(lái)恢復(fù)儲(chǔ)藏的工作然后在新的分支上繼續(xù)當(dāng)時(shí)的工作。

          7. 暫存未跟蹤或忽略的文件

          默認(rèn)情況下,git stash會(huì)緩存下列文件:

          • 添加到暫存區(qū)的修改(staged changes)
          • Git跟蹤的但并未添加到暫存區(qū)的修改(unstaged changes)

          但不會(huì)緩存一下文件:

          • 在工作目錄中新的文件(untracked files)
          • 被忽略的文件(ignored files)

          git stash命令提供了參數(shù)用于緩存上面兩種類(lèi)型的文件。使用-u或者--include-untracked可以stash untracked文件。使用-a或者--all命令可以stash當(dāng)前目錄下的所有修改。

          至于git stash的其他命令建議參考Git manual。

          小結(jié)

          git提供的工具很多,恰好用到就可以深入了解下。更方便的開(kāi)發(fā)與工作的。

          參考資料

          1. 6.3 Git工具-儲(chǔ)藏(Stashing)
          2. Git Stash 歷險(xiǎn)記
          3. Git Stash用法
          4. Git Stash

          posted on 2020-12-14 11:02 paulwong 閱讀(266) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): GIT

          主站蜘蛛池模板: 磐石市| 延庆县| 榆社县| 衡阳县| 新巴尔虎右旗| 永嘉县| 嘉禾县| 崇左市| 普安县| 丰镇市| 纳雍县| 遂宁市| 新昌县| 中宁县| 黄石市| 苏尼特右旗| 英超| 湄潭县| 镇宁| 枣强县| 龙口市| 拉孜县| 西藏| 新竹市| 勃利县| 涟源市| 天祝| 上蔡县| 阳春市| 寿宁县| 安阳县| 开原市| 长海县| 新河县| 洪湖市| 墨竹工卡县| 庐江县| 宁德市| 冷水江市| 镇康县| 塔河县|