git切换到别的分支,要暂时保存当前分支的修改(不想进行add 和commit)的方法 git stash
参考博客:https://blog.csdn.net/anhenzhufeng/article/details/78052418
官方说明:https://git-scm.com/docs/git-stash
命令总结
存储当前已经 add 过的所有文件
git stash save "info"
查看当前分支的所有栈
git stash list
恢复上一个栈中的内容,并删除栈帧
git stash pop
手动应用栈
git stash apply stash@{0}
git stash drop stash@\{0}
git stash apply stash@\{0\}
手动删除栈
git stash drop stash@{0}
理论说明:
假设现在有两个分支:
master
master_a
master分支中有:
1.cpp
已经add commit了。
master_new分支是从master分支新创建的,添加了一个2.cpp。
现在master_new分支用有两个文件
1.cpp
2.cpp
其中1.cpp是已经add commit了的,因为是从master分支过来的且没有变化。
2.cpp是新添加的,并没有add commit。
如果现在直接切换分支到master分支,那么你会发现2.cpp跟着到了master分支。并且2.cpp在master分支中也是未跟踪(add)的。
这样就会污染master分支。
所以在切换分支时如果有新添加的文件,那么就不能直接切换分支。
并且此时如果不想进行commit的话(东西还没弄好),可以使用git stash save "info",暂存起来
但是需要先add 2.cpp,使2.cpp处于跟踪状态。如果不进行add,stash如果没有检测到其他改变就不会进行暂存。
git stash save "info"
使用git stash list命令就可以查看当前分支所有的栈。
git stash list
可以看到如下结果
stash@{0}: On master_new: info
此时目录中会回到当前mster_new分支的最后一次commit的状态。
使用git status 命令可以看到
# On branch master_new
nothing to commit (working directory clean)
此时再进行切换分支就不会影响到别的分支。
例如切换到master分支添加了3.cpp,然后进行了add commit。
此时再切换到master_new分支,你可以看到还是只有1.cpp,因为master_new是从master分支过来的,master_new的上一次commit就是当时master的最后一次commit。
此时可以使用
git stash pop
或者,先使用git stash list找到自己上次stash的栈(根据那个自己写的info注释),然后手动 apply 栈。
git stash list
git stash apply stash@{0}
使用git stash pop 可以看到
# On branch master_new
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: 2.cpp
#
Dropped refs/stash@{0} (6b755c478012ed31013a2d617239f7468e873ad3)
此时再使用git stash list可以发现没有栈了,pop 栈弹出以后就没有了。
但如果使用git stash apply stash@{0} 就还可以在栈中发现这个栈。
注意有的时候有可能使用方法是
git stash apply stash@\{0\}
apply的提示信息如下:
# On branch master_new
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: 2.cpp
#
没有pop最后一行的drop信息。
此时再使用git stash list可以看到栈还在:
stash@{0}: On master_new: master_new stash again