储藏工作进度 git stash

在开发途中,有git add了一些内容和未追加的内容,但此时有紧急处理的事情,需要切换到某一条分支下修复功能,但git不能直接切换(不在同一个开发版本下)例如v1.2的最新开发进度如下所示
commit 9815af9d1a1639499cb784c32a2c0e390998a067
Merge: 4c6447e 84cb30d
Author: zx <zx@git.com>
Date:   Tue Nov 29 22:36:11 2016 +0800Merge branch 'master' into v1.2commit 84cb30d370453e2e1a7dc2c3d974c397a8fa53b2
Author: zx <zx@git.com>
Date:   Tue Nov 29 22:28:08 2016 +0800add by 2016.11.29commit 4c6447ec598616638b1d78d0c04757d48a04701a
Author: zx <zx@git.com>
Date:   Sun Nov 20 10:45:14 2016 +0800test 1 for v1.2

而v1.1分支的开发进度如下所示。

commit 28f059eb7d9479cc6d5c6f684e106bd540f1f1e5
Author: zx <zx@git.com>
Date:   Sun Nov 20 10:18:47 2016 +0800test 3 for v1.1commit d8033d48714dcaf8b8fabfbaacc6df8b79b23600
Author: zx <zx@git.com>
Date:   Sun Nov 20 10:17:52 2016 +0800test 2 for v1.1commit f35d10ace6da47c1b19c4eaf682e5e6645a3d2e1
Author: zx <zx@git.com>
Date:   Sun Nov 20 10:16:54 2016 +0800test 1 for v1.1

使用情景:两条分支处于并行开发的状态,v1.1和v1.2负责开发和测试不同模块的功能。工作时正好处于v1.1的开发中,中途有git add一些修改好的文件,以及未提交的文件,因为代码才写到一半,此时突然需要修改v1.2代码的功能,并且任务非常紧急。因为工作区中有正在修改和添加代码的文件,暂存区中又有修改好的文件。如果强制切换到v1.2分支上,git会提示切换失败,如下所示。

ghost@ghost-machine:~/workspace/test/Project_test$ git checkout v1.2
error: Your local changes to the following files would be overwritten by checkout:readme.txt
Please, commit your changes or stash them before you can switch branches.
Aborting
ghost@ghost-machine:~/workspace/test/Project_test$

原因是工作区并未干净,如下所示

ghost@ghost-machine:~/workspace/test/Project_test$ git status
位于分支 v1.1
要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)修改:     readme.txt尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     v1.1_test.txtghost@ghost-machine:~/workspace/test/Project_test$

此时用到git的储藏

命令:git stash

这个时候使用git储藏命令,将工作的内容暂时保存,即储藏起来,此时工作区是干净的,这样就可以切换到v1.2分支上修改功能。

ghost@ghost-machine:~/workspace/test/Project_test$ git stash
Saved working directory and index state WIP on v1.1: 28f059e test 3 for v1.1
HEAD 现在位于 28f059e test 3 for v1.1
ghost@ghost-machine:~/workspace/test/Project_test$ git status
位于分支 v1.1
无文件要提交,干净的工作区
ghost@ghost-machine:~/workspace/test/Project_test$ git checkout v1.2
切换到分支 'v1.2'
ghost@ghost-machine:~/workspace/test/Project_test$

恢复工作进度 git stash pop

命令:git stash pop
或命令:git stash apply

该命令是将保存的进度恢复到工作区!

v1.2添加代码完成后,切换回v1.1将保存的进度恢复现场

ghost@ghost-machine:~/workspace/test/Project_test$ git stash pop
位于分支 v1.1
尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     readme.txt修改:     v1.1_test.txt修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (21bfc22670ffe8c1a2d86dacfc9869954d49541b)
ghost@ghost-machine:~/workspace/test/Project_test$

可以看到,恢复了之后有个标记被丢弃,该标记的使命已经完成

丢弃了 refs/stash@{0} (21bfc22670ffe8c1a2d86dacfc9869954d49541b)

并且之前提交的git add 也返还成未提交的状态。

整理git储藏

查看储藏信息git stash list

再次将刚才的信息压入储藏,使用命令:git stash list可以看到储藏信息。

ghost@ghost-machine:~/workspace/test/Project_test$ git stash list
stash@{0}: WIP on v1.1: 28f059e test 3 for v1.1
ghost@ghost-machine:~/workspace/test/Project_test$ git log
commit 28f059eb7d9479cc6d5c6f684e106bd540f1f1e5
Author: zx <zx@git.com>
Date:   Sun Nov 20 10:18:47 2016 +0800test 3 for v1.1

储藏的信息

WIP on v1.1     :执行储藏的分支为v1.1分支
28f059e         :执行储藏是所处的工作区位置的commit哈希值为28f059e,这边仅显示前面的几位数。
test 3 for v1.1 :执行储藏是所处的工作区位置的commit的注释。

git 储藏区可以储藏多条工作区信息

ghost@ghost-machine:~/workspace/test/Project_test$ git stash list
stash@{0}: WIP on v1.4: 8602795 add pathc diff is 2
stash@{1}: WIP on v1.5: 8602795 add pathc diff is 2
stash@{2}: WIP on v1.1: 28f059e test 3 for v1.1

若储藏着多条信息,需要恢复中间或下面的几条时,只需要在恢复命令后面添加对应的编号即可。
如恢复stash@{2}: WIP on v1.1: 28f059e test 3 for v1.1这个储藏,切换至v1.1分支,输入一下命令:

命令:git stash pop stash@{2}
ghost@ghost-machine:~/workspace/test/Project_test$ git stash pop stash@{2}
位于分支 v1.1
尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     readme.txt修改:     v1.1_test.txt修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 stash@{2} (f84083046e26f5fa5d96bd2d2952f0a6f063633f)
ghost@ghost-machine:~/workspace/test/Project_test$

git stash恢复出错处理

不在执行储藏的分支上恢复

注意:工作区与暂存区无分支概念,在哪条分支或master主干上都可以进行恢复,此时就会造成冲突!如下所示,在v1.2添加完功能后,忘记切换回v1.1分支,就会出现冲突。

ghost@ghost-machine:~/workspace/test/Project_test$ git stash pop
自动合并 readme.txt
冲突(内容):合并冲突于 readme.txt
ghost@ghost-machine:~/workspace/test/Project_test$ git status
位于分支 v1.2
要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)修改:     v1.1_test.txt未合并的路径:(使用 "git reset HEAD <文件>..." 以取消暂存)(使用 "git add <文件>..." 标记解决方案)双方修改:   readme.txtghost@ghost-machine:~/workspace/test/Project_test$ git diff
diff --cc readme.txt
index eb645f1,86550a8..0000000
--- a/readme.txt
+++ b/readme.txt
@@@ -1,5 -1,3 +1,9 @@@add 2016.06.13++<<<<<<< Updated upstream+test for git stasha++add by 2016.11.29
++=======
+ test git stash
++>>>>>>> Stashed changes
ghost@ghost-machine:~/workspace/test/Project_test$

git stash pop恢复后并没有删除储藏进度,恢复错误后将错误的文件git checkout还原,工作区干净后切换到对应的分支,在git stash pop恢复现场
步骤如下
根据提示现将文件reset,然后再将文件checkout还原。

ghost@ghost-machine:~/workspace/test/Project_test$ git reset HEAD v1.1_test.txt readme.txt
重置后取消暂存的变更:
M   readme.txt
M   v1.1_test.txt
ghost@ghost-machine:~/workspace/test/Project_test$ git status
位于分支 v1.2
尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     readme.txt修改:     v1.1_test.txt修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ghost@ghost-machine:~/workspace/test/Project_test$ git checkout readme.txt v1.1_test.txt
ghost@ghost-machine:~/workspace/test/Project_test$ git status
位于分支 v1.2
无文件要提交,干净的工作区
ghost@ghost-machine:~/workspace/test/Project_test$

恢复后就可以切换回分支v1.1来恢复现场。

不在分支的一个工作点恢复

例如v1.1分支在某个时间处理紧急任务,将工作进度储藏,但处理完后回到v1.1分支,忘记了该分支有储藏,没有恢复现场,继续开发。分支提交了几个commit后发现该分支还有代码在储藏着,需要恢复回来。

v1.1日志

commit 5bb1cf87d50d9591f98d3966c9da278bbd23766d
Author: zx <zx@git.com>
Date:   Thu Dec 1 21:28:45 2016 +0800add 2016.12.01commit 28f059eb7d9479cc6d5c6f684e106bd540f1f1e5
Author: zx <zx@git.com>
Date:   Sun Nov 20 10:18:47 2016 +0800test 3 for v1.1

git 储藏区情况

ghost@ghost-machine:~/workspace/test/Project_test$ git stash list
stash@{0}: WIP on v1.1: 28f059e test 3 for v1.1
stash@{1}: WIP on v1.4: 8602795 add pathc diff is 2
stash@{2}: WIP on v1.5: 8602795 add pathc diff is 2
ghost@ghost-machine:~/workspace/test/Project_test$

执行git stash pop后,git会自动合并冲突,并列出冲突的地方。

ghost@ghost-machine:~/workspace/test/Project_test$ git stash pop
自动合并 readme.txt
冲突(内容):合并冲突于 readme.txt
ghost@ghost-machine:~/workspace/test/Project_test$ git status
位于分支 v1.1
要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)修改:     v1.1_test.txt未合并的路径:(使用 "git reset HEAD <文件>..." 以取消暂存)(使用 "git add <文件>..." 标记解决方案)双方修改:   readme.txt

冲突的文件:

ghost@ghost-machine:~/workspace/test/Project_test$ git diff
diff --cc readme.txt
index 664a8e0,86550a8..0000000
--- a/readme.txt
+++ b/readme.txt
@@@ -1,3 -1,3 +1,7 @@@add 2016.06.13++<<<<<<< Updated upstream
 +add by 2016.12.01
++=======
+ test git stash
++>>>>>>> Stashed changes
ghost@ghost-machine:~/workspace/test/Project_test$

这时解决冲突的方法和打补丁解决冲突的方法一样,手动删除旧的代码,保留最新的修改,再次提交说明“这个操作是合并储藏”即可。

git版本管理软件——git储藏相关推荐

  1. git版本管理软件——git发布补丁和打补丁

    某几个文件的代码修改后要发到同事开发的代码中,或者修复了bug后要将修复的代码添加到另外一份库中,这个时候手动记下改动太麻烦,git有创建补丁的功能,即将改动的代码统一添加到一个补丁文件中,后缀名为. ...

  2. 版本管理软件--Git的安装、配置并使用

    版本管理软件分类 集中式,典型代表 SVN 分布式,典型代表 Git 安装 安装git,一直 下一步 安装即可,如果不想安装到C盘,可以把C换成D 不要安装到含有中文的路径中. 安装完毕,不可以剪切( ...

  3. git版本管理软件——搭建git服务器

    创建管理员git 为管理员用户添加sudo权限 生成管理员秘钥 设置管理员git提交账号和邮箱 下载安装gitolite 启动gitolite 添加项目版本库 添加项目成员 项目成员下载项目 gito ...

  4. (十九)git版本管理软件——搭建git服务器

    创建管理员git 为管理员用户添加sudo权限 生成管理员秘钥 设置管理员git提交账号和邮箱 下载安装gitolite 启动gitolite 添加项目版本库 添加项目成员 项目成员下载项目 gito ...

  5. Git版本管理软件使用

    Git是目前世界上最先进的分布式版本控制系统,下面介绍如何使用Git管理项目. 一.下载Window Git工具 https://pan.baidu.com/s/1EF_KybTb32VACzXniF ...

  6. Git 版本管理之git神器版本回退(版本回退-已经commi t尚未push到remote仓库)

    起语: 版权声明: 腾讯课堂->零声学院. 我只是用来方便学习 && 复习!!! 我只是一个学习者, 从来不对我说过的话负责, 大家看到谨慎参考!!! 版本回退-已经commi ...

  7. Git 版本管理之git神器查看commit的信息

    起语: 版权声明: 腾讯课堂->零声学院. 我只是用来方便学习 && 复习!!! 我只是一个学习者, 从来不对我说过的话负责, 大家看到谨慎参考!!! 查看commit的内容 g ...

  8. 版本管理工具Git(2)git的使用

    上一篇带大家认识了Git,在本篇中将讲解Git的安装及使用: Git系列导航 版本管理工具Git(1)带你认识git 版本管理工具Git(2)git的安装及使用 版本管理工具Git(3)VS下如何使用 ...

  9. ❤️❤️爆肝3万字整理小白入门与提升分布式版本管理软件:Git,图文并茂(建议收藏)❤️❤️

    小白快速快入门Git 什么是Git SVN VS Git 什么是版本控制 安装Git 谁在操作? Git本地仓库 本地仓库构造 重点 Git常用基本操作 git add git commit git ...

  10. Linux git版本管理的使用/git教程

    转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 1.git教程 史上最浅显易 ...

最新文章

  1. 基于libmad库的MP3解码简析
  2. 鼠标滚动缩放图片效果
  3. 成功解决You are using pip version 9.0.3, however version 10.0.1 is available. You should consider upgr
  4. jq php异步上传图片,PHP+Ajax实现图片异步上传预览
  5. Ubuntu下面Master PDF Editor背景颜色设置
  6. 斑马无线打印服务器,如何设置斑马打印机无线WiFi
  7. 链表创建、逆置、删除详解
  8. IO静态映射和动态映射
  9. BZOJ3997 TJOI2015组合数学(动态规划)
  10. php网站鼠标美化,几款耐用的鼠标指针皮肤,简约清新
  11. java时间格式化工具类_java日期格式化工具类
  12. Wowza服务器系列(1):介绍
  13. Equations of Mathematical Magic题解
  14. 极化的概念及天线极化方式
  15. 基础内网信息探针思路
  16. php 蛋糕一刀均分试题,5个小朋友分一个蛋糕,只准切三刀,该怎样才能平分
  17. av_interleaved_write_frame(fmt_ctx, enc_pkt);返回-22
  18. 第一套微信小程序教程目录(转载侵删)
  19. win7 用软碟通装ubuntu双系统
  20. Rust FFI 编程 - Bindgen 工具介绍

热门文章

  1. 介绍一种AI的抠图方法
  2. 交叉编译linux内核实例(最详细)总结
  3. C++ Class6-虚函数-虚析构-多态-纯虚函数-抽象类-静态联编和动态联编-多态小练习(英雄联盟)
  4. GDS List内容详情
  5. 存储系统结构、MDR、MBR、扇区
  6. MYSQL根据经纬度查询最近距离
  7. LaTeX 插入图片 公式
  8. Overture五线谱乐理小课堂——音程 (上)
  9. element遮罩_如何实现全屏遮罩(附Vue.extend和el-message源码学习)
  10. 【bootstraptable】JS访问用户媒体设备摄像头,进行拍照保存