分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
git branch //查看分支
git branch zhdyaa //创建分支
git checkout zhdyaa //切换到了zhdyaa分支下
再用git branch查看,会看到有两个分支master和zhdyaa,当前使用的分支前面会有一个* (虽然切换到了zhdyaa,但是里面的文件是一样的。)
在zhdyaa分支下 ,编辑2.txt,并提交到新分支
echo "askdfjlksadjflk" > 2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj"
切换回master分支
git checkout master //此时cat 2.txt发现并没有更改内容
git checkout master //合并分支之前,先切换到目标分支
git merge zhdyaa //把zhdyaa分支合并到了master
[root@zhdy-01 gitroot]# ls
aa.txt asd.txt
git commit -a //查看提示信息
git branch -d zhdyaa //删除分支
git branch -D zhdyaa
对于分支的应用,建议大家以这样的原则来:
dev分支合并bob分支的命令是:
git checkout dev //先切换到dev分支,然后
git merge bob
在远程master创建一个文件:
点击下面的提交!在github上面提交文档是一个可视化的界面,比较直观的可以看出你所想看到的信息。
在本地克隆远端的分支:
[[email protected]01 ~]# cd /data/
[[email protected]01 data]# ls
1.txt gitroot mongodb mysql redis svnroot wwwroot
[[email protected]01 data]# git clone git@github.com:zhangduanya/zhdya.git
正克隆到 'zhdya'...
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 9 (delta 0), reused 6 (delta 0), pack-reused 0
接收对象中: 100% (9/9), done.
[[email protected]01 data]# ls
1.txt gitroot mongodb mysql redis svnroot wwwroot zhdya
[[email protected]01 data]# cd zhdya
[[email protected]01 zhdya]# ls
asd.txt README.md zhdya.txt
当我们再次在客户端查看的时候发现只有一个分支:
[root@zhdy-01 zhdya]# git branch
* master
[[email protected]-01 zhdya]# git ls-remote origin //可以看到所有分支
30dda46a3d3441861df8136ef486da5d22b2cc84 HEAD
30dda46a3d3441861df8136ef486da5d22b2cc84 refs/heads/dev
30dda46a3d3441861df8136ef486da5d22b2cc84 refs/heads/master
[[email protected]-01 zhdya]# git checkout -b dev origin/dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
[[email protected]-01 zhdya]# git branch
* dev
master
本地和远程分支的名称要一致(并且也自动切换到了dev)
在新的仓库里面添加一个文件:
[root@zhdy-01 zhdya]# vim newdev.txt
[root@zhdy-01 zhdya]# git add newdev.txt
[root@zhdy-01 zhdya]# git commit -m "add newdev.txt"
[dev bc31da5] add newdev.txt
1 file changed, 2 insertions(+)
create mode 100644 newdev.txt
[root@zhdy-01 zhdya]# git push
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 347 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:zhangduanya/zhdya.git
30dda46..bc31da5 dev -> dev
如上操作“git push” 会更新所有的仓库,但是有时候我们只需要更新到某个仓库,如何操作呢?(只推送dev,和master没有任何关系)
[[email protected]-01 zhdya]# git push origin dev
Everything up-to-date
[root@zhdy-01 zhdya]# git branch dev2 //创建一个分支
[root@zhdy-01 zhdya]# git branch //查看分支
* dev
dev2
master
[root@zhdy-01 zhdya]# git checkout dev2 //切换到分支
切换到分支 'dev2'
[root@zhdy-01 zhdya]# vim zzz.txt
[root@zhdy-01 zhdya]# git add zzz.txt
[root@zhdy-01 zhdya]# git commit -m "add zzz.txt"
[dev2 26d61f8] add zzz.txt
1 file changed, 3 insertions(+)
create mode 100644 zzz.txt
[root@zhdy-01 zhdya]# git push origin dev2
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 277 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To git@github.com:zhangduanya/zhdya.git
* [new branch] dev2 -> dev2
然后我们到服务端去查看:
标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。一般用于发布一个版本,后期为了能更加清楚的去辨析所创造的!
git checkout master 先切到master分支上
git tag v1.0 给master打一个标签v1.0
git show v1.0 查看标签信息
git tag 可以查看所有的标签
tag是针对commit来打标签的,所以可以针对历史的commit来打tag
git log --pretty=oneline //先查看历史的commit
git log --pretty=oneline --abbrev-commit //使用简写的commit
30dda46 Create asd.txt
275c8e9 add zhdya.txt
68cb217 add README.md
git tag v0.9 46d3c1a //针对历史commit打标签
git tag -a v0.8 -m "tag just v1.1 and so on" 5aacaf4 //可以对标签进行描述
git tag -d v0.8 //删除标签
[[email protected]01 zhdya]# git push origin v1.0 //推送指定标签到远程
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:zhangduanya/zhdya.git
* [new tag] v1.0 -> v1.0
git push --tag origin //推送所有标签
如果本地删除了一个标签,远程也想要删除需要这样操作:
git tag v1.0 -d //删除本地标签
git push origin :refs/tags/v1.0 //删除远程标签
其实我感觉没有多大必要,任何事物都是孰能生巧,况且Linux还可以那么人性化的TAB键。对于别名其实TAB键已经足够了!
git commit 这个命令是不是有点长? 用别名可以提高我们的工作效率
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
查看git别名使用命令
git config --list |grep alias
查看配置文件:
[[email protected] zhdya]# cat /root/.gitconfig
[user]
name = zhdya
email = [email protected]
[push]
default = simple
[alias]
cc = commit
查询log小技巧:(如下图可以很清晰的显示各种信息)
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
使用 git lg
取消别名
git config --global --unset alias.br