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
文章目录