git stash详解
场景:
周一上班,本来想干活的,一看自己在预发分支,切develo分支还切不过去,一看自己可能周六加班脑袋不清除,在release分支上面修改了代码。
此时,我也不想在release上面提交,然后解锁了git stash,发现这个贼好用。
git stash,完了切换到develop分支,然后git stash pop一下,之前在release分支上面修改的内容就到develop分支上面了,同时release分支恢复到之前你刚刚push的状态,正式我想要的结果。
下面,我们了解一下stash
其他场景:
1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。
这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
命令详解:
1.git stash
能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
1 $ git status 2 On branch master 3 Changes not staged for commit: 4 (use "git add <file>..." to update what will be committed) 5 (use "git checkout -- <file>..." to discard changes in working directory) 6 7 modified: src/main/java/com/wy/CacheTest.java 8 modified: src/main/java/com/wy/StringTest.java 9 10 no changes added to commit (use "git add" and/or "git commit -a") 11 12 $ git stash 13 Saved working directory and index state WIP on master: b2f489c second 14 15 $ git status 16 On branch master 17 nothing to commit, working tree clean
2.git stash save
作用等同于git stash,区别是可以加一些注释,
如下: git stash的效果:
1 stash@{0}: WIP on master: b2f489c second
git stash save “test1”的效果:
stash@{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 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中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。
5.git stash apply