赞
踩
现在很多代码版本控制的时候使用的git,而不是传统的svn版本控制工具。所以本篇就简单聊一下这个工具使用。
其实无论是软件开发最头疼一件事情那就是版本控制,其实很常见,比如大学毕业时候写论文,一般我们改一次然后保存一个版本,防止写更改的出现问题。
而软件开发自然也无法避免,这个问题,毕竟有一个开发者的死对头:产品经理(开玩笑)。再不停的对软件开发的时候进行需求调整,改完可能过了几天又要改回去。当然本身程序员写的代码也有个问题,比如有时候觉某代码可以进一步优化,最后发现出现各种问题。
这个版本控制有大致分两类:
集中式(svn为代表):
就是一台服务器控制版本,然后其它的开发电脑写完程序后,提交新的代码带
分布式
这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码 仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用 其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次 对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码 文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
于是Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!因为是大神linux写的版本控制控制,所以其很多命令于linux命令相同。而这个也就让一些大神开始尝试使用这个git这个版本管理工具了,但不得不说让git更加迅速为人所知的需要感谢github这个网站的诞生。
除了其分部式存储的优点外,git相对于集中控制版本的工具还有一些其它优点。
前面说到git每一个用户对整个文件仓库的完整备份。这个涉及到两个问题,那就是版本迭代后的存储方式。
svn的存储方式是差异性存储,简单的说就是
这样svn虽然存储的时候占的存储空间变少,但是其有一个弊端那就是比如迭代了很多版本后,如果想要回到某个版本就需要一次根据存储版本的差异而合成到自己要找的版本。
而git其对整个文件仓库的完整备份,而linus牛逼之处就是虽然保留了全部文件,但是通*加密压缩方式,最后文件只是比集中式备份的存储空间大一点点。
而存储的版本有一个序列存储,通过指针而选择不同的版本。
而git在版本控制中,可以同时推进多个任务,每个任务可以创建每个人物的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时 候,不会影响主线分支的运行。(分支可以简单理解为副本,一个分支就是 一个单独的副本。)
同时并行推进多个功能开发,提高开发效率。各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败 的分支删除重新开始即可。
其不但可以在不同的分支来回切换,还可以在版本控制的时候,分支可以进行合并,合并也不会立马合并,而是会将合并的主版本和被合并的部分的差异显示出来,让版本控制者进行审查再合并(哪怕是统一文档,也会显示出差异)。而各自的分支结构又有各自的版本,方便用户进行各个版本的控制。
简单的说就是:版本控制系统允许程序员通过“分叉”将项目的版本分成不同的“分支”,来跟踪项目的每个分支的变化,从而实现多人在同一项目上工作,而不会相互影响。一旦有人对分支进行了更改,它们就可以上传回原始项目并与原始项目合并,这一过程称为“提交”。这个系统允许程序员在将他们的文件合并回被称为存储库的主项目之前,在他们自己的分支上独立工作。
在Git出现之前,想要与其他程序员协作的程序员根本没有多少选择。他们通常会使用一个开源的版本控制系统Subversion。虽然Subversion过去和现在都很流行,但和其他特定的版本控制系统一样,Subversion也有缺点。可以说,这些缺点是当时的协作编程概念所固有的。即使使用Subversion,与开源团队一起工作也往往需要获得项目管理员的许可,才能对项目进行分叉(毕竟版本控制是集中式其在一个控制版本的服务器上),而不是处理代码本身。在许多情况下,这个批准过程比编写代码花费的时间都要长。许多开源项目都会受到权限问题、网关问题和其他低效问题的困扰。
其团队协作机制,不但支持内部团队,还支持跨团队协作机制。那就就是:fork
(别问图哪里的,因为是盗用的)
跨团队协作
这个就需要使用fork这个功能了,fork可以复制出一个仓库的新拷贝,包含了原有库中的所有提交记录,fork后这个代码库是完全独立的,可以在自己的库中做任何修改,也可以向原来的库提交合并请求。
有些东西,比如git发展以及优点不说吧,感觉会少一些东西,所以直接网站找一些内容,直接复制了,所以现在看是搞一下具体的用法。
git的安装,可以通过官网下载安装:官网地址:https://git-scm.com/
git命令其实兼容了很多linux的命令,所以对于文件的增删改,以及查看等就不再赘述,如果需要可以看一下些的Linux基础。
其实很多时候程序员使用的时候,不是通过图形界面而是通过命令进行实现的,看一下历史就明白,开发linux和git的大神是一个人,所以git中很多兼容linux的命令,因此对于linux的使用者很友好,不过对于使用windows系统的也没必要惊慌,其很多常用的命令也不算很多。
如果想要通过命令窗口查看命令的命令: git --help
命令 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名,说白就是提交代码时候知道谁提交的 |
git config --global user.email 邮箱 | 设置用户邮箱,毕竟代码出现问题或者其它事情,至少可以找到提交者 |
git init | 初始化本地库,和node init一样,初始一下环境,告诉git这个地方就是我要提交需要控制版本的文件 |
git status | 查看本地库的状态 |
git add 文件名或者用 ( . ) 代表全部 | 添加到缓存区 |
git commit -m “可以来一些描述信息” | 提交到本地库 |
git reflog | 查看历史记录 |
git diff 文件 | 查看文件变化内容 |
git reset --hard 版本号 | 可以切换版本 |
注意: 上面写用户名,如果关联github的话,两者可以说没有关系,不要混为一谈。
打开某文件的git命令窗口最简单的方式是:
无论点击文件夹然后右键,还是进入到此文件夹内右键都可以,如图:
初始化,用大白话来说就是告诉git版本控制工具,这个是我要控制版本的仓库,你老准备吧,然后把你需要配置文件也给我创建吧。
git init
然后把文件夹的行为:显示隐藏文件
然后就看见多出一个文件夹:.git
然后进去看有什么:
现在说一下每个文件夹或文件是做什么的。
hooks文件 夹
目录包含客户端或服务端的钩子脚本。hook很多编程中都有,比如逆向js中的hook函数等,其本质就是通过某些事件触发,然后触发这个事情走这个hook脚本,对其进行操作。后面有几乎就聊如何在git中写脚本。
info 文件夹
包含一个全局性排除文件。目录包含一个全局性排除(global exclude)文件, 用以放置那些不希望被记录在 .gitignore
文件中的忽略模式(ignored patterns)
logs 文件夹
保存日志,方便查询。
objects 文件夹 重要
目录存储所有的数据内容,也就是各个版本的存储文件。
refs 文件夹 重要
目录存储指向数据(分支、远程仓库和标签等)的提交对象的指针;签名说过git的分支优点,那自然需要有一个文件记录这些分支的内容,而这个地址存储的指针,可以理解:object存储的是不同的版本,而这个文件就是纪录不同分支然后其对应的不同版本地址信息。
config文件
文件包含项目的配置信息。
description文件
用来记录项目/仓库的描述信息
HEAD文件 重要
文件指示目前被使用的分支,说白了目前正在使用那个分支,还是需要git。
index 文件 重要
文件需要先通过add 添加到暂存区,而这个就是保存暂存区消息
其实git分:底层命令和高层命令。
设置签名其实分为项目级别(仓库级别)和全局级别(系统级别)。
设置项目级别
git config user.name 名字
git config user.email 邮箱
全局级别
git config --global user.name 名字
git cofnig --global user.eamil 邮箱
其实这个账户邮箱就是区别一些提交这个代码的人是谁,后面会聊github,而这个和github的用户秘密没有丝毫关系。
现在聊一下签名遵守的一些规则
如果看这个项目中参与的人:
// 查看项目签名
方式1:cat .git/config
方式2:git config --list // 这样会看见很多信息也可以看到全局用户签名
// 查看全局用户签名
git config --global --list
删除配置签名或邮箱:
// 删除全局配置签名和邮箱
git config --global --unset user.name
git config --global --unset user.email
// 删除项目配置签名和邮箱
git config --unset user.name
git config --unset user.email
现在演示一下:
上面至少显示了一些自己用户的设置,如果我们需要看一个项目的开发人员参与应该如何,我从github上clone一个项目,具体如何clone项目,后面聊。
// 查看项目的创建人信息 git show // 显示所有用户,邮件以及在当前分支中提交次数 git shortlog --summary --numbered --email //或者缩写 git shortlog --sne // 如果要看所有分支 git shortlog --sne -all // 如果要看提交了什么内容或者说内容谁提交的 git log // 也可以单独看那一个提交的详细信息 git show commit提交号(可以全部输入也可以输入一部分) --stat
例子演示:
查看创建项目人
查看项目提交人以及提交次数
查看提交项目以及提交人是谁
所以可以看出要写要给签名,不让就是做好事不留名,然后发公司统计的时候发现,钱没你的事情。所以在开发过程中,一定要做事留名。
其实这个命令在不同的情况是不同,在git add 以及 git commit后使用也是不同的程序效果。
git status
简单的描述分目前分支是那个,以及提交版本或者将要提交的版本。
这三个放在一起聊。
首先你需要在版本初始化的文件夹下面创建一个文件,可以使用linux命令,当然比如创建一个文件名为:test.txt.
//提交到缓存区
git add 文件名或者用(.) 表示全部
// 删除缓存区内容
git rm --cached 文件名
// 将存储区的内容提交上去
git commit -m (注释内容)
创建完文件后查看状态:
添加到缓存器以及查看状态:
删除缓存,然后查看状态
提交缓存器然后看状态
// 查看版本信息
git reflog
// 查看版本的详细信息(这个看签名的时候用过)
git log
首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。
看一下创建的test.txt文件内容:
cat test.txt //linux命令 如果不太了解可以看一下我分析的linux基础文章
然后添加文件为:
aaaaaa
bbbbbbbb
ccccc
然后可以用命令查看文件变化的内容:
git diff test.txt
然后再把这个版本提交上去,后面需要切换版本的时候体现出来,下面不再具体贴图了。
git add test.txt
git commit -m 'test第二次提交'
其实git切换版本,底层其实是移动的HEAD指针。这个原理目前不扯开了讲,先记住即可。
切换版本:
git reset --hard 版本号
分支是很牛的思想,既然可以通过分支进行分部操作,自然也会进行整合。
所以现在聊分支的创建,以及切换以及整合。
常用命令:
命令 | 描述 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
创建分支,说是分支其实:将主分支(默认master)的内容(在那个分支上创建分支,那个分支就可以理解为当前主分支。)内容复制一份。
所以不要理解为树木那样分出一个树枝,而是将内容也拷贝一份,然后开发其中的某个模块。
// 创建一个分支
git branch test_branch
可以查看一下分支去又哪些。
git branch -v
既然可以弄分支,那自然也可以切换分支了。
// 切换分支
git checkout 分支名
可以看出两个test文件内容时一样,现在分支test_branch修改test.txt 文件为
aaaaaa
bbbbbbbb
111111`
记得添加缓存,然后提交后,再切换到master主分支看一下。
然后看一下 内容(注意:如果不提交,你来回切换内容一致):
可以看出同一个文件,各自分支控制的版本内容也是不一致的,所以这个就设计到一个事情了,毕竟产品开放的时候,自然也是需要合并的,不然就是奔着一起分别开发,最后变成多个文件了。
这个合并之前,先做个事情,那就是再主线程master中的test.txt,文件也添加内容。
aaaaaa
bbbbbbbb
2222222
然后再mater主分支上合并test_branch分支。
git merge test_branch
合并的时候,如果是test_branch分支是增量而master分支不变,这样直接添加即可。但是如果两者都有增量,而且有差异的时候,就需要人工对差异的地方进行简单修改,就是打开文件,看是两者都保存还是如此了。
合并后也要提交版本啊。
还有一个需要团队模式才可以体验的内容,这个说好话需要搭建一个git服务器才可以操作,这个涉及到pull ,push等命令。为了方便演示同时也有现成的免费在在线的服务,国外最出名的github,以及国内的gitee,本篇有点长了,所以下篇聊这些。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。