Git实战

来自软件实验室
跳转至: 导航搜索

版本控制的意义

  • 简单有效的文件备份
  • 不花钱的后悔药
  • 团队协作的不二法宝

版本控制的历史

  • RCS(Revision Control System):rcs
  • CVS(Concurrent Version System):cvs
  • CVCS(Centeralize Version Control System): subversion
  • DVCS(Distributed Version Control System): git

git的简短历史

  1. 2005年4月3日:开始开发Git
  2. 2005年4月6日:项目发布
  3. 2005年4月7日:Git成为自身的版本控制工具
  4. 2005年4月18日:发生第一个多分支合并
  5. 2005年4月29日:Git的性能达到了Linus的预期
  6. 2005年6月16日:Linux内核的2.6.12发布,此时,Git已经是Linux内核的版本控制系统了。
  7. 2005年7月26日:Linus功成名退,将Git的维护交给Git另外一个主要贡献者:Junio C Hamano,直到现在。

版本控制系统的功能

  • 跟踪文件的变化
  • 建立分支
  • 建立里程碑(tag)

版本控制系统的佼佼者:Git

记录快照!而非差异

大多数VCS记录文件版本间的差异,如下图所示:

Vcs record diff.png

而Git记录的是文件的快照,即文件在某个时刻的完整内容!

Git record snapshort.png

使用哈希保证数据的完整性

每个文件/目录都采用哈希算法生成一个字符串,使用该字符串代表文件而不是文件名

每个本地仓库都是完整的副本

也就是每个项目都是完整的,几乎所有的有关版本的操作都在本机进行,这样的好处:

  • 很快
  • 每个团队成员都拥有一个完整的备份

文件的三个位置

Git file position.png

  • 工作区
  • 暂存区
  • 本地仓库

于是自然存在以下几个问题:

  • 如何查看工作区内容? 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

分支的使用策略

这里是几篇很有见地的文章:

解决冲突

坚持以下原则减少冲突:

  • 加强线下沟通
  • 修改前先更新
  • 经常提交

一旦产生冲突,必须修改冲突文件,然后git add;git commit重新提交。

冲突的解决方法可以参见:http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html

使用Github

利用github的基本流程图:

Git flow.png

(图片源文件git_flow.dot

建立私有的Git服务器

图形化的Git工具

  • qgit
  • gitk
  • tig

参考资源

寒假作业

  • 花几天时间阅读文件:Gitmagic zh cn.pdf,了解和掌握git的基本用法,在接下来的编程实践中,始终用git管理你的代码。
  • 进一步的阅读材料:pro git,请自”搬书匠“自行搜索下载。
  • C语言综合练习,完成一个通讯录系统,要求参见文件:C语言综合课程设计.doc。组建团队,通过github协作完成此项目:https://github.com/R314/c-skeleton
  • 有余力可以尝试阅读Unix环境高级编程,或者linux环境系统系统调用