git版本管理软件——git储藏
2017-09-07 09:59
330 查看
储藏工作进度 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 +0800 Merge branch 'master' into v1.2 commit 84cb30d370453e2e1a7dc2c3d974c397a8fa53b2 Author: zx <zx@git.com> Date: Tue Nov 29 22:28:08 2016 +0800 add by 2016.11.29 commit 4c6447ec598616638b1d78d0c04757d48a04701a Author: zx <zx@git.com> Date: Sun Nov 20 10:45:14 2016 +0800 test 1 for v1.2
而v1.1分支的开发进度如下所示。
commit 28f059eb7d9479cc6d5c6f684e106bd540f1f1e5 Author: zx <zx@git.com> Date: Sun Nov 20 10:18:47 2016 +0800 test 3 for v1.1 commit d8033d48714dcaf8b8fabfbaacc6df8b79b23600 Author: zx <zx@git.com> Date: Sun Nov 20 10:17:52 2016 +0800 test 2 for v1.1 commit f35d10ace6da47c1b19c4eaf682e5e6645a3d2e1 Author: zx <zx@git.com> Date: Sun Nov 20 10:16:54 2016 +0800 test 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.txt ghost@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 +0800 test 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.txt ghost@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 +0800 add 2016.12.01 commit 28f059eb7d9479cc6d5c6f684e106bd540f1f1e5 Author: zx <zx@git.com> Date: Sun Nov 20 10:18:47 2016 +0800 test 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服务器
- git版本管理软件——git发布补丁和打补丁
- 【真是好东西呀】版本管理软件Git
- 代码版本管理软件Git的优势和用法
- GitBlit git版本库管理软件安装
- git版本管理软件——git日常管理代码
- Git1--git是什么[开源版本控制系统;软件配置管理工具]
- git版本管理软件——git分支管理
- git版本管理软件——git初始化配置
- Android Studio之版本管理工具Git
- Git版本管理1-安装配置和同步
- 版本管理:Git 使用起步(一)
- 项目开发管理技术之项目版本控制、软件建模、软件测试、项目文档管理
- .gitignore可以指定哪些文件不纳入版本库的管理
- 用GIT管理项目版本
- Git 版本管理工具(一)
- Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统
- 版本管理工具 (git 或者 svn)
- Git版本管理工具的使用
- xcode 4 Git版本管理系统详解