Git
主讲人:王静
目录
- Git简史
- Git与Svn的区别
- Git的使用
- Git杂症
- 适合我们Git工作流
1 Git简史
1.1 Git是什么?
- Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
- 关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
1.2 Git简史
- Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上,2002年,整个项目组开始 启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
- 2005年,bitKeeper与Linux解约,Linux开发了自己的版本系统Git(速度、简单、非线性、 分布、大数据)
1.3 版本管理历史
本地版本控制(Local Version Control Systems)
- 复制文件(记错、混淆、覆盖文件)
- 数据库记录历次更新的差异
- 在硬盘上保存补丁集
集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS SVN)
1)不同操作系统同步代码
2)集中管理版本的服务器,通过客户端请求服务器获取最新的代码,或提交 新的代码
3)好处:项目成员之间可以大致了解彼此都做了什么工作,管理CVCS更容易 一些
分布式版本控制系统(DVCS Git)
1)Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提 取最新版本的文件快照,而是把代码仓库完整地镜像下来。
2)系统都可指定和若干不同远端代码仓库进行交互。你可以 在同一个项目中,分别和不同工作小组的人相互协作。
2 svn与git的区别
2.1 svn与git的区别
- 1)git是分布式的,svn是集中式
(Local Repository,即使OffLine也可Commit,查看Log,创建项目分支等操作,等OnLine时 Push到Server端。)
- 2)git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,恢复比较麻烦, 耗时。
- 3)svn必须先Update才能Commit,忘记了合并时就会出现一些错误,git可以先提交, push的时候再做更新。
- 4)若有5个Branch,svn需要复制5个版本的文件到本地,而且每次找版本还要跟之前作比 较;git则只需获取.git的仓库,拉取master分支到本地。(so fast)
- 5)Branch:svn一人建一个分支,创建到远程仓库里,git则可实行分支开发,开发好再合 并到主干,不影响别人。
常用的svn与git命令对比如下:
svn admin create ——————————> git init
svn co ——————————> git clone
svn update ——————————> git pull
svn add ——————————> git add
svn commit ——————————> git add, git commit
svn status ——————————> git status
svn switch <branch> ————————> git checkout <branch>
svn merge <branch> ————————> git merge <branch>
svn revert <file> ——————————> git checkout <file>
2.2 Git优点
- 1)直接记录快照,而非差异 比较
- 2)近乎所有操作都是本地执 行(Local Repository)
- 3)Git 保证完整性(SHA-1哈 希算法)
- 4)Git 一般只添加数据(便于恢复)
- 5)三种状态:已修改 (modified)、已暂存(staged)和 已提交(committed)(出错可及时 修改)
- 6)分布式(Branch开发方 便)
3 Git的使用
3.1 Git安装与配置
- git下载路径:https://git-scm.com/downloads
- 傻瓜式安装
- 向运维申请GitLab账号
- 配置
- 1)配置用户信息:
- $ git config –global user.name “wangjing”
- $ git config –global user.email “wangjing5@up366.com”
- 2)创建并配置SSH
- ssh-keygen -t rsa -C “wangjing5@up366.com” 按3个回车,密码为空
- 先执行 eval `ssh-agent` 再执行 ssh-add ~/.ssh/rsa(自己的存放路径)成功cd ~/.ssh
- 在GitLab添加SSH Key,即添加“id_rsa.pub”里面的公钥、
- Git Gui可以直接Help->Show SSH Key
- 3)在自己的分组下边找到自己的项目,根据地址拉取(git clone 地址)
Git命令
3.2 Svn转Git
- 将svn项目转成git项目克隆到本地仓库
- $ git svn clone http://svn.up366.com/svn/up366school/trunk/up366school/src/com/up366/ school/actions/base
3.3 Git基本命令
- $ git clone https://github.com/libgit2/libgit2
- $ git init
- $ git pull
- $ git add .
- $ git commit -m ‘initial project version’
- $ git push
- $ git status
- $ git log
- 图形界面都可以实现
- 注:项目文件下边右键Git Brash,或IDEA项目下边直接Terminal,都可以直接使用Git命令
3.4 Git .gitignore
.gitignore文件的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
- 各种版本的忽略规则:https://github.com/github/gitignore
Git高级——TAG
- Tag是一种final类型的指针
- 为了记录发布的版本
- 即标签
Git高级——分支
3.5 Git高级——分支
- 分支(branch)
- $ git branch v2
- $ git rebase v3
- $ git merge v3
- 1)新建分支:$ git checkout -b iss53
- 2)分支代码改变:
- 3)分支合并:$ git merge iss53 (两边都 有提交时先 $ git rebase master)
4)分支合并完成
- 3.6 实例操作一下
- 1)创建一个分支new Branch:branch1
- 2)branch1修改两遍代码,提交两次branch1,2
- 3)Master上修改一遍代码,提交一次Master1
- 此操作就相当于,分支一直修改代码,当你想合并时,可以去主分支先拉取一下代码,然 后回来发现主分支有代码提交,可能存在冲突,则进行如下操作:
- 4)切回到branch1,将主分支的修改Rebase onto自己的branch,可以看到在一条主线
- 执行rebase操作另一个分支提交的代码将会合并到branch1,2的前边,但是提交时间等不会 变化
- 5)再回到master,执行Merge操作,就将所有代码合并到主分支了
- 注:如果分支只是改一个小bug,只进行一或两次提交,可以直接master将两次提交直接 Cherry-Pick过来,提交;如果没有Rebase,直接Merge到master,会出现Merge问题,解决 如下:
Git杂症
4.1 Git Merge
4.1.1 出现原因
- 1)提交自己写的代码到本地
- 2)拉取远程代码到本地
- 3)造成Merge,及时处理,千万不要直接Push
4.1.2 解决Merge
- 1)将最后一个版本建立一个分支B
- 2)回归到主分支master,Reset Current Branch To Here 回退到自己提交代码的上一个别人 提交的版本
- 3)将B分支自己提交的那个代码Rebase到主分支
- 4)将GitLab上的远程分支改成unprotected,然后将代码force push到服务器就可以了,删 除分支,变为一条线
- 注:记得将GitLab上的远程分支的权限再改回protected哦
4.1.3 规避Merge
- 1)VCS在Commit Changes的之后,不需要再去Update Project,这样本地就会出现Merge
- 2)直接Push提交到远程,自动会去拉取远程提交的代码,如果有Merge,直接Rebase就好
- 3)提交到服务器
4. 2 为什么要去解决Git Merge
一条线看起来整洁,便于多个项目一同管理,便于查看提交
适合我们的Git工作流
5. Git哪种分支更适合我们?
- 1) master 为 发布分支。
- 提测后,只能提交测试提出来的bug修改代码。
- 新加功能,另开分支开发。
- 2)个人新开功能,新开本地分支,开发完毕后同步到主线分支.
- 3) 修改底层公用代码,尽早同步完成。同步完通知大家,各分支做内容合并。
- 4)几个人同时开发新功能,上线时间不确定时,切出来一个分支。该分支只提交与该新功 能有关代码(其他bug不做同步)。完成后将代码同步主分支。
Git书籍推荐
https://git-scm.com/book/zh/v2
Git书
使用 Sway 创建
创建和共享交互式报表、演示文稿、个人故事等。
本sway地址:https://sway.com/p8D2UphSK1o3Dmdz