问题:使用 git add . 不能将有的文件存入暂存区。
一、git stash
能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
1.1 git stash 两种应用场景
对于多人并行开发,维护同一仓库工作场景,经常会出现文件合并冲突的情况,常见场景如下:
1.1.1 改动同一分支
我在本地修改好后,发现远程分支已经被改动了,此时我本地也被改动了就造成了冲突,无法push或者pull。
此时可以使用git stash:
git stash save “本地缓存内容标识” //把本地的改动暂存起来;
git pull //拉取远端分支(此时本地分支会回滚到上次commit的情况,新的改动都已保存在了stash中);
git stash pop // 将栈顶改动内容重新加回本地分支,就可以继续修改了,当然,如果改好了就是
add,commit,push操作。
1.1.2 不小心改动其他分支
当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
或者由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
例如忘记切换分支,直接在master分支上做改动,这里假设我的分支是test分支。
git stash // 把本地当前改动暂存起来,此时master分支就恢复到了上次拉取时的状态
git checkout test // 切换到需要改动的分支
git stash pop // 将改动pop到自己当前的分支
顾名思义,stash就是一个栈,把需要暂存的文件存到栈中,把代码恢复到上次拉取的状态以进行操作,而
git stash pop 就是让栈顶元素出栈并删除。
git stash apply 则是只取栈顶元素,但是不删除。
这样会有一个显而易见后果,如果我再次执行git stash,新的改动将会出现在栈顶,栈中元素会越来越多,此时可以使用 git stash list 命令查看栈中元素,此时每个栈中元素会有自己对应的编号
使用git stash apply stash@{0} (0可以换成对应编号),来添加不同改动。同样,你也可以 git stash drop stash@{0} 来删除对应改动。
git stash clear 可以清空。
1.2 git stash 常用命令
git stash 常用命令:
git stash save “save message” : 执行存储时,添加备注,方便查找,只有 git stash 也可以,但查找时不方便识别。
git stash list :查看 stash 了哪些存储。
git stash show 显示做了哪些改动
git stash show stash@{1}。 显示第二个改动
git stash show :显示做了哪些改动,默认 show 第一个存储,如果要显示其他存贮,后面加 stash@{$num},比如第二个 git stash show stash@{1}。
git stash show stash@{$num} -p 显示第几个存储的改动
git stash show -p : 显示第一个存储的改动,如果想显示其他存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p。
git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即 stash@{0},如果要使用其他个:git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}。
git stash pop
git stash pop :恢复之前缓存的工作目录,并将缓存堆栈中的对应 stash 删除,同时将对应修改应用到当前的工作目录下,默认为第一个 stash,即 stash@{0},如果要应用并删除其他 stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}。
git stash drop stash@{1} ,从列表中删除这个存储。
git stash clear :删除所有缓存的 stash。
!说明!: 新增的文件,直接执行 stash 是不会被存储的,如果要保存这个新增的文件,需要首先执行 git add 命令把文件添加到git版本控制中,然后再执行 git stash 命令进行缓存。
二、git stash 与 git add 关系
git add 只是把文件加到 git 版本控制里,并不等于就被 stash 起来了,git add 和 git stash 没有必然关系,但是执行 git stash 能正确存储的前提是文件必须在 git 版本控制中才行。
常规 git stash 的一个限制是它会一下暂存所有的文件。有时,只备份某些文件更为方便,让另外一些与代码库保持一致。一个非常有用的技巧,用来备份部分文件:
add 那些你不想备份的文件(例如: git add file1.js, file2.js);
调用 git stash –keep-index。 只会备份那些没有被 add 的文件。
调用 git reset 取消已经 add 的文件的备份,继续自己的工作。