git stash的详细讲解

前言

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所在的提交.以下图标来表示stashbranch的关系.

git stash 工作树

HHEAD提交.I是存储单元的提交.W是工作树中的提交.

应用举例

通过几个实际的示例来了解一下git stash的强大.

开发到一半,同步远端代码

当你的开发进行到一半,但是代码还不想进行提交 ,然后需要同步去关联远端代码时.如果你本地的代码和远端代码没有冲突时,可以直接通过git pull解决.但是如果可能发生冲突怎么办.直接git pull会拒绝覆盖当前的修改.

遇到这种情况,需要先保存本地的代码,进行git pull,然后再pop出本地代码:

git stash
git pull
git stash pop
工作流被打断,需要先做别的需求

当开发进行到一半,老板过来跟你说"线上有个bug,你现在给我改好,不然扣你鸡腿".当然,你可以开一个新的分支,把当前代码提交过去,回头再merge,具体代码如下

繁琐的工作流示例
# ... hack hack hack ...
 git checkout -b my_wip
 git commit -a -m "WIP"
 git checkout master
 edit emergency fix
 git commit -a -m "Fix in a hurry"
 git checkout my_wip
 git reset --soft HEAD^
# ... continue hacking ...

我们可以通过git stash来简化这个流程

正确姿势
# ... hack hack hack ...
 git stash        //保存开发到一半的代码
 edit emergency fix
 git commit -a -m "Fix in a hurry"
 git stash pop   //将代码追加到最新的提交之后
# ... continue hacking ...
提交特定文件

如果对多个文件做了修改,但是只想提交几个文件,或者想先暂时保存几个修改,测试其他文件的执行结果.可以通过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'
恢复被错误clear/drop的存储

如果因为失误对存储仓库进行了clear或者drop操作,在一般机制下是不能恢复的.但是可以通过以下指令来获取仍在仓库中的,但是已经不可获取的存储列表

git fsck --unreachable |
grep commit | cut -d\  -f3 |
xargs git log --merges --no-walk --grep=WIP

git stash 的具体用法

git stash通过在指令后添加其他的附件选项,实现复杂的定制化操作,下面我们来对具体用法进行讲解.

save, push
  • save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]

  • push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>…​]

savepush命令都可以用于存储修改.并且将git的工作状态切回到HEAD也就是上一次合法提交上.后面的<message>是选填项.

如果给定具体的文件路径,git stash只会处理路径下的文件.其他的文件不会被存储

--keep-index(简写为-k)只会存储为加入git管理的文件

--include-untracked为追踪的文件也会被缓存,当前的工作空间会被恢复为完全清空的状态.如果不使用--include-untracked而是用--all,那么除了未加入管理的文件,被git忽略(ignore)的文件也会被缓存.

--patch命令可以让我们选择当前修改和HEAD提交diff部分.

list

list [<options>]展示当前存储库中的存储单元列表.每个元素包含的信息有索引位置,存储时所在的分支,存储前的提交的描述.举例

stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash
show

show [<stash>]展示存储单元和最新提交的diff结果.如果没有给定<stash>参数时,会对比最新的存储单元.

pop

pop [--index] [-q|--quiet] [<stash>]移除单个存储单元.和git stash save的作用相反.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容