小谈git
前言
上家公司使用的是git来管理代码,由于最近的工作变动,新公司大部分代码都是使用svn管理代码,对于git的使用还不是很普遍,于是将我之前学的一些git使用技巧及我所理解的原理来做一次整理并且分享。希望大家看这篇文章的都能有所收获。
svn和git的区别
svn和git都是版本控制系统,只不过是svn是集中式版本控制,而git是分布式版本控制,而且是当今世界上最大的分布式版本控制。那集中式版本控制和分布式版本控制的区别在哪里呢,那先看看下面俩张图。 集中式管理的工作流程 分布式管理的工作流程
从图一就可以知道SVN他有一个中央服务器,每个人可以从一定程度上看到项目中其他人干了啥,管理员也可以轻松的掌握每个开发者的权限。然而有利有弊,就是这个中央服务器的单点故障时,就是如果是宕机一小时,那么在这一小时内,谁都无法提交更新、还原、对比等,如果磁盘发生故障,没有做备份或者备份的不够,还有可能造成丢失数据。以下是找到的svn的特点。 SVN的特点
- 每个版本库有唯一的URL(官方地址),每个用户都从这个地址获取代码和数据;
- 获取代码的更新,也只能连接到这个唯一的版本库,同步以取得最新数据;
- 提交必须有网络连接(非本地版本库);
- 提交需要授权,如果没有写权限,提交会失败;
- 提交并非每次都能够成功。如果有其他人先于你提交,会提示“改动基于过时的版本,先更新再提交”… 诸如此类;
- 冲突解决是一个提交速度的竞赛:手快者,先提交,平安无事;手慢者,后提交,可能遇到麻烦的冲突解决。
从图二就可以看出,git他没有一个中央服务器,准确的来说每一个人的本地都相当于一个中央服务器,他只有一个远端,一个公共服务器。所以呢,普通git的话所有人相当于拥有查看所有代码权限,之后就有些git管理仓库的产生,为开发团队提供存储,分享,发布和合作开发项目的中心化存储的场所,来便于权限控制。比如Gitlab和Github。而我所知道的在Gitlab和Github在组中一般是有五中权限:Guest、Reporter、Developer、Master、Owner
- Guest:一般没人用这个客人权限。可以创建issue(问题)、发表评论,可是不能读写版本库。
- Reporter:QA、PM赋予这个权限,可以克隆代码,不能提交。
- Developer:普通开发者的权限,可以克隆代码、开发、提交、push。
- Master:核心RD负责人可以赋予这个权限。可以创建项目、添加tag、保护分支、添加项目成员、编辑项目。
- Owner:开发组leader可以赋予这个权限,可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员。
对于正常项目的多人开发,一般开发俩种权限就够了,developer和master。 从developer的开发者角度来看,git的以下功能。
- 从服务器上克隆完整的Git仓库(包括代码和版本信息)到本地上。
- 在自己的机器上根据不同的开发目的,创建分支,修改代码。
- 在本地上自己创建的分支上提交代码。
- 本地上合并分支。
- 把远端服务器上最新版的代码fetch下来,然后跟自己的分支合并。
- 上步操作可能出现的情况是改了同份文件的同样位置的代码,这时候就产生了冲突。解决一下产生的冲突(合作解决冲突)。
- 之后生成补丁(patch),把补丁推送到远端服务器。
以上就是git管理工具的最最最基础的使用方法了。后面还会有打标签,不同分支不同作用。
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库.
git的使用
git工作流程
git有这么一个概念,就是四个区域,分别是
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
工作区:你在拉取远程分支所在的地方,几乎就是你在拉到代码之后所处的本地环境就俗称工作区,在该区域,就是平时开发的地方。
暂存区:顾名思义就是暂存的地方,就是.git目录下面的index文件,暂存区会通过git add来添加文件的相关信息,他是不保存文件实体的,是通过id来指向每个文件实体。也可以使用git status来查看暂存区的状态。暂存区是标记了你当前的工作区,哪些内容是被git所管理的。但很重要的就是在完成某个需求之后第一步就应该是使用git add来提交到暂存区,让git去管理。
本地仓库:在从远端拉取过来之后就有的仓库,在一次次git commit后同步index目录树到本地仓库,最后使用git push来同步本地仓库和远程仓库
远程仓库:远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
下面我从网上找了一张图比较直观的阐述了这区域之间的关系
git常用命令
第一步先理解一下head,head是他始终是在当前分支最新提交点上,在你所处的分支发生改变了,或者你的分支自己提交了或者别人提交了,head都会发生变化。如下图可视化工具能够很明确的看出来。
add
对于add也很简单,就是为了让git管理,将你工作区的修改内容提交到暂存区。主要也就是
- git add .
- git add 【dir】
- git add 【file1】
这时候大家就注意了,命令行工具是不是很简单,可是呢如果是不想要add的部分东西呢,那还得输入【git reset 文件名】撤销对于git的add操作,但是如果使用可视化工具咋样,如下面俩张图所示 点击提交,那+和-号不是很明显吗
commit
commit的相关命令也很简单。他的主要操作也就是将暂存区的内容提交到本地仓库,并使当前分支的head向后移动一个提交点 命令如下:
- git commit -m 【message】
- git commit 【file1】 -m 【message】
是不是很简单,来看看可视化工具如何操作。 我的天呐,来来来 继续 分支更能体会到可视化工具的好处了
branch
涉及到协作,git里面一个最重要的就是分支了,命令行操作大概有这四种 查看分支、切换分支、创建分支、删除分支这四大操作
- git branch
- git branch -r
- git branch -a
- git branch 【branch-name】
- git checkout -b 【branch-name】
- git branch --track【branch】【remote-branch】
- git checkout【branch-name】
- git branch -d 【branch-name】
- git push origin --delete 【branch-name】
记住这些操作吧,这只是普通的操作。 可视化工具如何实现呢,先看看下面的图 一顿操作猛如虎,可以了,分支之类的操作都完成了。
merge
也到了团队合作里面最重要的一步了,那就是合并,同样先看命令行
- git fetch 【remote】
- git merge 【branch】
一般合并之后,如果出现修改了同一个文件的同一个地方发生了变更,那只能手动解决冲突。那么问题来了!!!但是使用命令行工具的话,对于新手很容易找不到方向,那就看看可视化工具。 我来将test02合并到test上面。 首先要切换到test上面,如何将test02合并进去,那就可以了。
rebase
衍合是合并的其他一种解决就是,这是我网上找的,就很清晰。 这用的不是很多,有需求再来说吧
revert
git revert用一个新提交来消除一个历史提交所做的任何修改。
- git reset是直接删除指定的commit,git revert是用一次新的commit来回滚之前的commit。
- 从效果上面看是一样的,但是时间长了就会有区别,因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,减少冲突。但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入,产生很多冲突。git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
push
上传本地仓库到远程仓库
- git push 【remote】【branch】
- git push 【remote】–force
- git push 【remote】–all
可视化工具会简单不少。好嘞,就暂时这样吧,git的基础操作大概这些。
|