一、本地仓库版本回退
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,另一种表达形式:HEAD~100。
回退到上一个版本:
$ git reset --hard HEAD^
$ git reset --hard 1094a
注:后悔了想回到之前,只要有commit id即可,Git提供了一个命令 git reflog 用来查看你的每一次命令
二、撤销修改
1.工作区
git checkout -- file可以丢弃工作区的修改:
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
2.暂存区
git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区
三、git rm
从版本库中删除文件:
$ git rm 并 git commit
另一种情况是删错了,因为版本库里还有,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除
四、合并
通常合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
$ git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
五、分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
六、cherry-pick
$ git cherry-pick 4c805e2
cherry-pick能够单独将某个节点,即提交的某一个版本,将其中的提交内容合入进来,你只需知道其commit id即可。
cherry-pick后,git会自动做一次提交。用git cherry-pick,我们就不需要在不同分支上手动再修改相同的代码并完成同样的操作了。
七、远程分支
要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:
$ git push origin dev
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream-to origin/<branch-name> <branch-name>
八、tag
标签也是版本库的一个快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
$ git tag v0.9 f52c633
可以用git show <tagname>查看标签信息,还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
注意:标签总是和某个commit挂钩
$ git tag //可以查看所有标签。
如果标签打错了,也可以删除:
$ git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令
$ git push origin <tagname>
或者,一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
查看commit历史:
$ git log --graph --pretty=oneline --abbrev-commit