<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    git-stash用法小結

    緣起

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

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

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

    git stash用法

    1. stash當前修改

    git stash會把所有未提交的修改(包括暫存的和非暫存的)都保存起來,用于后續恢復當前工作目錄。
    比如下面的中間狀態,通過git stash命令推送一個新的儲藏,當前的工作目錄就干凈了。

    $ 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

    需要說明一點,stash是本地的,不會通過git push命令上傳到git server上。
    實際應用中推薦給每個stash加一個message,用于記錄版本,使用git stash save取代git stash命令。示例如下:

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

    2. 重新應用緩存的stash

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

    $ 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)

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

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

    3. 查看現有stash

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

    $ 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命令時可以通過名字指定使用哪個stash,默認使用最近的stash(即stash@{0})。

    4. 移除stash

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

    $ 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創建分支

    如果你儲藏了一些工作,暫時不去理會,然后繼續在你儲藏工作的分支上工作,你在重新應用工作時可能會碰到一些問題。如果嘗試應用的變更是針對一個你那之后修改過的文件,你會碰到一個歸并沖突并且必須去化解它。如果你想用更方便的方法來重新檢驗你儲藏的變更,你可以運行 git stash branch,這會創建一個新的分支,檢出你儲藏工作時的所處的提交,重新應用你的工作,如果成功,將會丟棄儲藏。

    $ 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)

    這是一個很棒的捷徑來恢復儲藏的工作然后在新的分支上繼續當時的工作。

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

    默認情況下,git stash會緩存下列文件:

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

    但不會緩存一下文件:

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

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

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

    小結

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

    參考資料

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

    posted on 2020-12-14 11:02 paulwong 閱讀(264) 評論(0)  編輯  收藏 所屬分類: GIT

    主站蜘蛛池模板: 免费一级特黄特色大片| 巨波霸乳在线永久免费视频| 亚洲国产精品嫩草影院在线观看 | 日本大片在线看黄a∨免费| 国产免费播放一区二区| 亚洲视频欧洲视频| 亚洲第一成人影院| 亚洲精品在线免费看| 国产亚洲欧美日韩亚洲中文色| 亚洲精品中文字幕无码蜜桃| A在线观看免费网站大全| 一个人晚上在线观看的免费视频| 亚洲男人天堂av| www.亚洲精品| 国产大片免费网站不卡美女| 黄色a三级三级三级免费看| 91情国产l精品国产亚洲区| 亚洲精品国产高清不卡在线| 18禁止观看免费私人影院| 国产黄在线播放免费观看| 在线a亚洲老鸭窝天堂av高清| 亚洲熟妇中文字幕五十中出| 大学生一级特黄的免费大片视频 | 国产又大又粗又硬又长免费| 精品四虎免费观看国产高清午夜| 日韩欧美亚洲中文乱码| 亚洲高清视频在线播放| 国产亚洲精品激情都市| 国产又大又粗又硬又长免费| 久草视频免费在线观看| 在线观看肉片AV网站免费| 免费国产污网站在线观看不要卡| 亚洲三级在线免费观看| 亚洲av无码乱码国产精品fc2| 亚洲精品国产福利一二区| 免费观看毛片视频| 一色屋成人免费精品网站 | 亚洲日韩aⅴ在线视频| 国产成人免费手机在线观看视频 | av午夜福利一片免费看久久| 亚洲AV无码AV吞精久久|