Git实战
来自软件实验室
目录
版本控制的意义
- 简单有效的文件备份
- 不花钱的后悔药
- 团队协作的不二法宝
版本控制的历史
- RCS(Revision Control System):rcs
- CVS(Concurrent Version System):cvs
- CVCS(Centeralize Version Control System): subversion
- DVCS(Distributed Version Control System): git
git的简短历史
- 2005年4月3日:开始开发Git
- 2005年4月6日:项目发布
- 2005年4月7日:Git成为自身的版本控制工具
- 2005年4月18日:发生第一个多分支合并
- 2005年4月29日:Git的性能达到了Linus的预期
- 2005年6月16日:Linux内核的2.6.12发布,此时,Git已经是Linux内核的版本控制系统了。
- 2005年7月26日:Linus功成名退,将Git的维护交给Git另外一个主要贡献者:Junio C Hamano,直到现在。
版本控制系统的功能
- 跟踪文件的变化
- 建立分支
- 建立里程碑(tag)
版本控制系统的佼佼者:Git
记录快照!而非差异
大多数VCS记录文件版本间的差异,如下图所示:
而Git记录的是文件的快照,即文件在某个时刻的完整内容!
使用哈希保证数据的完整性
每个文件/目录都采用哈希算法生成一个字符串,使用该字符串代表文件而不是文件名
每个本地仓库都是完整的副本
也就是每个项目都是完整的,几乎所有的有关版本的操作都在本机进行,这样的好处:
- 很快
- 每个团队成员都拥有一个完整的备份
文件的三个位置
- 工作区
- 暂存区
- 本地仓库
于是自然存在以下几个问题:
- 如何查看工作区内容? ls
- 如何查看暂存区内容?
- 如何查看仓库的内容?
- 如何查看工作区和暂存区的差别?
- 如何查看暂存区和仓库的差别?
- 如何查看工作区和仓库的差别?
安装Git
apt-get install git
Git的全局配置
- 列出全部全局配置:git config --global -l
- 用户名:git config --global user.name "su baochen"
- 邮箱:git config --global user.email subaochen@126.com
- editor: git config --global core.editor vim
- git help config 查看所有支持的配置选项
单机使用Git
仓库初始化
git init
仓库初始化后,你的目录会多出一个.git目录,git仓库的所有信息都保存在.git目录里面。警告:除非你了解git的细节,否则这个目录不要随便修改!
添加文件到暂存区
- git add hello.c
- git add .
- git add *
查看文件的当前状态
- git status
- git help status
解释各种状态下的输出
提交文件
- git commit:提交所有add to staged area
- git commit -u: 列出没有添加到暂存区的文件(作为提醒)
- git commit -a:自动提交没有添加到暂存区的文件(不建议)
- git commit -m 'message' (强调message的重要性)
- git commit --amend 撤销提交
查看日志
- git log
- git log -1 HEAD(解释HEAD的含义)
- git log -2 -p:显示倒数两个+补丁(差异)
- git log --pretty=oneline
- git log --oneline --decorate --graph --all
比较文件
- git diff: 比较工作区和暂存区
- git diff --staged:比较暂存区和本地仓库
- git diff HEAD: what if git commit -a?
- git help diff:比较分支等
删除文件:提交时生效
- rm filename:如果文件还没有加入暂存区,直接删除即可
- git rm filename: 从工作区删除文件
- git rm -f filename:从暂存区删除文件,同时也从工作区删除
- git rm --cached filename:从暂存区删除,保留工作区文件,等价与git reset HEAD filename
- git reset HEAD filename 单纯从暂存区删除文件
其中filename可以使用shell的模式匹配
文件改名
- git mv file1 file2
里程碑(tag)
- git tag
- git tag -a v1.0 -m 'version 1.0' : annotated tag
- git show v1.0
- git tag v1.1
- git tag -a v1.2 9fce在特定的版本号标记里程碑
分支:精华所在
《pro Git》讲的相当精彩,from page 78
- git branch
- git branch branch_name
- git branch -d branch_name
- git branch -D branch_name
- git checkout branch_name
- git checkout -b branch_name
- git checkout -b branch_name 93e5
团队协作使用Git
以https://github.com/subaochen/gitmagic 为例
clone
- git clone URL
远程仓库管理
- git remote -v
- git remote add updtream URL
- git remote remove remote_name
远程分支管理
- git fetch(跟踪分支)
- git fetch origin master
- git merge origin master
- git pull(跟踪分支)
- git push(跟踪分支)
- git push origin master
- git checkout branch
- git checkout -b branch
分支的使用策略
这里是几篇很有见地的文章:
- A successful Git branching model: http://nvie.com/posts/a-successful-git-branching-model/
- Git分支管理策略: https://github.com/FoOTOo/footoo_newbie_guide/wiki/GIT%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86%E7%AD%96%E7%95%A5
解决冲突
坚持以下原则减少冲突:
- 加强线下沟通
- 修改前先更新
- 经常提交
一旦产生冲突,必须修改冲突文件,然后git add;git commit重新提交。
冲突的解决方法可以参见:http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html
使用Github
- 注册账户
- fork项目
- git clone项目到本地
- 设置项目跟踪upstream的变化:http://dz.sdut.edu.cn/blog/subaochen/2016/01/github%e7%9a%84fork%e5%92%8c%e4%b8%8a%e6%b8%b8%e9%a1%b9%e7%9b%ae%e5%90%8c%e6%ad%a5%e7%9a%84%e6%96%b9%e6%b3%95/
- 记得首先/经常更新本地项目跟踪upstream项目
- 修改
- git commit --no-ff origin master
- 到github网站pull request
利用github的基本流程图:
(图片源文件git_flow.dot)
建立私有的Git服务器
- gitlab:图形化界面管理,ruby
- gitbucket: https://github.com/gitbucket/gitbucket ,scala开发的
- gogs:https://github.com/gogits/gogs , go语言开发的
- gitolite:是gitosis的后继,能够实现完善的权限管理,ruby
- gitosis:已经停止开发
图形化的Git工具
- qgit
- gitk
- tig
参考资源
- gitmagic
- pro git
- 廖雪峰的网站: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- https://help.github.com/categories/collaborating-on-projects-using-pull-requests/
- 猴子能都读懂的Git入门:http://backlogtool.com/git-guide/cn/
- Git Community Book: http://gitbook.liuhui998.com/index.html
- 很好的关于merge/rebase的讲解:https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
- 图解git: http://marklodato.github.io/visual-git-guide/index-zh-cn.html
寒假作业
- 花几天时间阅读文件:Gitmagic zh cn.pdf,了解和掌握git的基本用法,在接下来的编程实践中,始终用git管理你的代码。
- 进一步的阅读材料:pro git,请自”搬书匠“自行搜索下载。
- C语言综合练习,完成一个通讯录系统,要求参见文件:C语言综合课程设计.doc。组建团队,通过github协作完成此项目:https://github.com/R314/c-skeleton
- 有余力可以尝试阅读Unix环境高级编程,或者linux环境系统系统调用