stash暂存代码

如果你修改了代码没有commit提交本地库,git拒绝你的切换分支命令。 如果我们不想提交不完善的代码,但是却不得不去修改一个紧急Bug,此时 stash 可以将当前未提交到本地仓库的代码,储藏(stash)到Git的栈中,而不是仓库中。stash后工作区和上次提交的内容是一样的,工作区变干净了,等我们修完Bug,提交并push到远端仓库后,再使用git stash apply或者pop命令,将以前完成一半的工作区恢复回来。stash 常用在修改代码过程中,切换到其他分支去的时候。stash可以把当前工作区的修改“保存”起来,以后用git stash pop 恢复现场。stash是本地的,不会传到远端仓库上。

基本命令

git stash  储藏到git栈中

git stash命令会将工作区和暂存区的修改储藏(stash)到Git的堆栈中,同时建立一条说明信息,默认是最后一次提交的节点号。

git stash save

git stash save ‘说明信息’ 是自定义说明信息,比较 git stash  多些了一点命令。它们效果一样,说明信息更加利于了解stash的内容。

应用中推荐给每个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 pop   

git stash pop命令将stash的内容从git栈中弹出, 恢复之前的工作区修改 。默认弹出最上面的那条,即stash@{0}。注:该命令将堆栈中最近保存的内容删除(栈是先进后出) 。

此外还可以在pop后加stash@{n}来指定要弹出的项目:

git stash pop stash@{1}

恢复指定的进度到工作区。stash_id是通过git stash list命令得到的

顺序执行git 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/jadddddddd.java

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc5 fsdfsfsfafasdfsfgegwea)

$ git stash list
stash@{0}: On master: test1

git stash apply

git stash apply将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除。git stash apply命令可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})。 

$ 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/jarwerwerwe.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
 
堆栈中的内容并没有删除。 

 

git stash list

列出当前仓库下所有的stash条目,每一条stash用stash@{n}标识。

$ git stash list
stash@{0}: On autoswitch: test-cmd-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 show stash@{n}

当有多条记录并且过了一段时间忘记stash内容时通过该命令可以查看stash的具体内容

删除stash

git stash drop 

丢弃stash条目,默认丢弃最上面的那条,即stash@{0},此外还可以在drop后加stash@{n}来指定要丢弃的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。

git stash clear

清除所有的stash条目



 

具体执行

现有两个分支master和dev001,当前的工作分支是dev001。

$ git branch
  master
* dev001


当前分支dev001的工作尚未完成,而另一项任务需要优先完成,需要创建一个新分支来工作,此时可以把当前工作现场“保存stash”起来,等紧急任务做完,再恢复stash pop工作区后继续工作。


1、保存工作区的修改
$ git stash
 执行上面命令后,查看状态

$ git status
On branch dev001
nothing to commit (working directory clean)

可见工作区是干净的

2、创建分支
    假设需要在分支master上修复,就切换到master上。

$ git checkout master
    在master上创建新分支bug001,并设为当前工作分支。

$ git checkout -b bug001
 创建bug001分支并且切换到该分支,开始紧急任务工作

$ git add test.txt
$ git commit -m "fix bug 100"

 3、等我们修改完bug,提交后,切换到master分支,准备把分支bug001的新改代码合并到master上。

$ git checkout master

在master分支上合并bug001分支。

$ git merge      --no-ff -m   "merge bug001"    bug001 

(--no-ff参数,表示禁用Fast Forward模式,禁用后Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息)。


最后,删除分支bug001。    

$ git branch -d bug001


4、恢复工作现场

现在,我们可以恢复到dev001分支继续之前的工作了。

$ git checkout dev001

恢复工作现场。

$ git stash pop


 


 

猜你喜欢

转载自blog.csdn.net/panjunnn/article/details/115117461
今日推荐