git是用来管理代码和工作流的强大工具,它以commit为单位,低成本开辟分支等优势备受青睐.
在实际开发中,我们常常遇到一些复杂的应用场景,不单单是pull,commit,push就能解决.
下面我们通过引入git stash的使用,来讨论在复杂情况下git发挥的强大功能.
-
git stash 的作用
git stash用于想要保存当前的修改,但是想回到之前最后一次提交的干净的工作仓库时进行的操作.git stash将本地的修改保存起来,并且将当前代码切换到HEAD提交上.
通过git stash存储的修改列表,可以通过git stash list查看.git stash show用于校验,git stash apply用于重新存储.直接执行git stash等同于git stash save.
最新的存储保存在refs/stash中.老的存储可以通过相关的参数获得,例如stash@{0}获取最新的存储,stash@{1}获取次新.stash@{2.hour.ago}获取两小时之前的.存储可以直接通过索引的位置来获得stash@{n}.
-
git stash的概念理解 git stash的每个存储单元在工作仓库中是通过commit的形式由树结构展示的,它的根节点是HEAD所在的提交.以下图标来表示stash和branch的关系。
-
git stash 工作树 H是HEAD提交.I是存储单元的提交.W是工作树中的提交.
应用举例
通过几个实际的示例来了解一下git stash的强大.
一、开发到一半,同步远端代码 当你的开发进行到一半,但是代码还不想进行提交 ,然后需要同步去关联远端代码时.如果你本地的代码和远端代码没有冲突时,可以直接通过git pull解决.但是如果可能发生冲突怎么办.直接git pull会拒绝覆盖当前的修改.
遇到这种情况,需要先保存本地的代码,进行git pull,然后再pop出本地代码
git stash
git pull
git stash pop
工作流被打断,需要先做别的需求
二、提交特定文件 如果对多个文件做了修改,但是只想提交几个文件,或者想先暂时保存几个修改,测试其他文件的执行结果.可以通过git stash save --keep-index来进行.
# ... hack hack hack ...
git add --patch foo //只将第一部分加入管理the index
git stash save --keep-index //将其余部分保存起来
edit/build/test first part
git commit -m 'First part' //提交全部的git管理中的代码
git stash pop //继续进行存储代码的工作
# ... repeat above five steps until one commit remains ...
edit/build/test remaining parts
git commit foo -m 'Remaining parts'