Git进阶之一

暂存工作区 — git stash的使用 & 打标签Release - git tag

Posted by Bruce Zhao on June 12, 2016

Estimated reading time: 11 minutes. {Git} [Git]

目录

{: .no_toc}

开始

当我们在一个分支上开发到了一半,发现另外一个分支上有一个bug急需修复,但是当前分支内容又没有完成不想提交该怎么办?当我们协作的时候,你pull到本地后,修改完后准备commit,发现已经有人在你之前已经commit了,这个时候如果commit,再push的话就会引起冲突,这种情况该怎么办呢?

解决的办法有很多种,最直接的就是出现冲突后,找到冲突标记的地方,手动修正然后提交。当然今天介绍一种稍微高级一点的方法,用git stash 暂存目前修改的内容。git pull同步后,再git stash pop 取回暂存内容,然后修改提交。下面通过一个例子来详细介绍一下使用方法。

最后顺带着将一下打标签这个功能 (逃

暂存工作区

下面两段话引自这里: http://www.cppblog.com/deercoder/archive/2011/11/13/160007.aspx, 本篇文章是在看了这篇文章后结合自己实际情况写的,目的是给自己备忘用,侵删。

使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码,如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用git stash pop将以前一半的工作应用回来。

也许有的人会说,那我可不可以多次将未提交的代码压入到栈中?答案是可以的。当你多次使用git stash命令后,你的栈里将充满了未提交的代码,这时候你会对将哪个版本应用回来有些困惑,git stash list命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用git stash apply stash@{1}就可以将你指定版本号为stash@{1}的工作取出来。当你将所有的栈都应用回来的时候,可以使用git stash clear来将栈清空。

常用命令

{```shell

git stash #备份当前的工作区的内容,工作区保证和上次提交的内容一致 git stash pop #从Git栈中读取最近一次保存的内容,恢复工作区的相关内容 git stash list #显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复 git stash clear #清空Git栈



### 情况一

当我们在一个分支中开发的时候,发现master有紧急bug,但是又不想提交完成一半或者不完善的代码到这个分支中,该怎么办?


```bash

# dev 分支上 
git stash
git checkout master

#master修改完成后
git checkout dev
git stash pop 

然后就可以接着在dev上继续上次的工作了。

情况二

当我们协作的时候,你pull仓库到本地,修改完后准备commit,发现已经有人在你之前已经commit了,这个时候如果commit,再push的话就会引起冲突,这种情况该怎么办呢?


git stash
git pull
git stash pop

这个时候Git会auto-merging,如果你修改的地方已经提别别人修改了,那么就会出现冲突。出现冲突后,需要找到对应的地方>>>>>>>>,然后手动修改。

修改完成后,需要输入 git add <file name> ,然后Git自动判断。 输入git status 来查看状态,如果已经添加就直接commit吧。

最后一定记得要删掉暂存的工作区间 git stash clear !

打标签

打标签用于打包当前的commit,常用于版本发布用。比如更新/发布了一个R包,通过打标签的形式让大家直接下载压缩包。当然你还可以在github上面编辑Release Note,用于说明本次更新的内容。

这里参考资料来自: Git Pro zh-v2 .


git tag  #列出所有标签
git tag -l 'v1.*'  #列出关于v1.x版本的所有标签

#创建标签
git tag -a v1.4 -m 'commit内容随便写点'

#查看标签详细信息
git show v1.4

#后期打标签
git tag -a v1.2 [hash]

#提交github
git push origin v1.4
git push origin --tags  #同步所有标签

#检出标签
git checkout -b [branchname] [tagname]  #在特定的标签上创建一个新分支

到这里文章开头的问题已经基本解决了。