①大环境:Git 诞生于一个极富纷争大举创新的年代。Linux 内核开
源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存
归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制
系统 BitKeeper 来管理和维护代码。
到 2005 年的时候,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结
束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux
的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不
至于重蹈覆辙。他们对新的系统订了若干目标
②Git和svn的对比
svn属于集中式版本管理控制系统,系统中保存了所有文件的修订版本,而协同工作人员通过连接svn服务器,提取出最新的文件,获取提交更新
下图就是标准的集中式版本控制工具管理方式
集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。
但是相较于其优点而言,集中式版本控制工具缺点很明显:
- 服务器单点故障
- 容错性差
Git原理分析
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而
大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar
等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记
录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件
作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再
次保存,而只对上次保存的快照作一连接。Git 的工作方式就像图 1.5 所示
这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的
实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础
的超强工具,而不只是一个简单的 VCS。
③特点
操作的本地执行
Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。
如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和
当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本
地来作比较。
也就是说,git无须联网,也可以实现离线上传
数据的完整性
在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作
为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。
这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完
整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。
三种状态
对于任何一个文件,在 Git 内都只有三
种状态:已提交(committed),已修改(modified)和已暂存(staged)。
已提交表示该文件已经被安全地保存在本地数据库中了;
已修改表示修改了某个文件,但还没有提交保存;
已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作目录以及暂存区域。
④下载
下载地址:https://git-scm.com/download
windows傻瓜式安装下一步即可。
linux下的安装服务端
1、安装git服务环境准备
yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc
2、下载git-2.5.0.tar.gz
1)解压缩
2)cd git-2.5.0
3)autoconf
4)./configure
5)make
6)make install
3、添加用户
adduser -r -s /bin/sh -c 'git version control' -d /home/git git
4、设置/home/git文件夹操作权限
mkdir /home/git
chown git:git /home/git
5、设置密码
passwd git
输入两次密码
6、切换到git用户
su git
7、创建git仓库
git --bare init /home/git/first
注意:如果不使用“--bare”参数,初始化仓库后,提交master分支时报错。这是由于git默认拒绝了push操作,需要.git/config添加如下代码:
[receive]
denyCurrentBranch = ignore
推荐使用:git --bare init初始化仓库。
下载tortoisegit:https://tortoisegit.org/download/ 相当于一个客户端。
⑤Git的工作流程
1)初始化:需要说明的是本地开发人员commit提交,需要使用自己本地仓库,只有先提交本地仓库,然后才能提交到远程仓库。本地仓库可以说是共享仓库的备份。
2)建立共享的版本库
在F盘建立仓库repository/git下面建立git的共享版本库,用户开发人员上传代码,更新代码等等
建立共享版本库有2种方式,一种是直接初始化,另一种是clone远程仓库
在当前目录下初始化了一个git仓库
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都
存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目
录,但我们还没有开始跟踪管理项目中的任何一个文件。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对
这些文件进行跟踪,然后提交:
建立用户本地仓库
本地仓库其实就是用户的工作空间,在git中本地仓库和工作空间项目如影随行,工作空间即是git本地仓库。因此本地仓库需要从共享仓库中检出文件。
我们可以先初始化一个仓库,然后从共享仓库中pull下载文件,也可以直接clone共享版本库中文件
使用的是 clone 而不是 checkout。这是个非常重要的差别,Git 收取的是项目历史的所有
数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即
便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到
当初克隆时的状态
克隆当前创建code仓库:前面初始化了一个,这里相当于复制,
命令:git clone /f/repository/git/.git/
克隆并重命名:git clone /f/repository/git/.git/ thegit
检查当前文件的状态
要确定哪些文件当前处于什么状态,可以用 git status 命令。如果在克隆仓库之后立即
执行此命令,会看到类似这样的输出:
$ git status
# On branch master
nothing to commit (working directory clean)
这说明你现在的工作目录相当干净。换句话说,当前没有任何跟踪着的文件,也没有任何
文件在上次提交后更改过。此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪
的新文件,否则 Git 会在这里列出来。最后,该命令还显示了当前所在的分支是 master,
这是默认的分支名称,实际是可以修改的,现在不必多虑。
现在让我们用 vim 编辑一个新文件 README,保存退出后运行 git status 会看到该文件
出现在未跟踪文件列表中:
$ vim README 文件编辑参考linux命令即可。
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README
nothing added to commit but untracked files present (use "git add" to track)
就是在“Untracked files”这行下面。Git 不会自动将之纳入跟踪范围,除非你明明白
白地告诉它这么做,因而不用担心把临时文件什么的也归入版本管理。不过现在我们确实想
要跟踪管理 README 这个文件。
设置个人信息
首先要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提
交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你
所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或
者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config文件里。
git config user.name "user1"
git config user.email "user1@163.com"
设置配置文件在.git目录下config文件,文件内容如下:
$ cat config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = F:/repository/git/.git/
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = user1
email = user1@163.com
- 添加
在user1用户中创建一个文件。
命令:touch a.java
创建成功后,此文件并没有纳入版本控制,因此不能提交。提交之前需要先纳入版本控制:
命令:git add a.java
Git通过命令add把文件纳入git版本控制中
- 提交
此时user1用户就可以提交:
使用如下命令提交在暂存区文件到仓库中,提交时必须添加注释信息,-m就表示添加注释信息。
git commit -m "the first" a.java
提交文件后,需要把文件提交共享版本库中:origin记录clone来源地
git push origin master
- 更新
git pull
直接从共享版本库中下拉项目文件即可
Eclipse集成egit:问度娘吧
用户信息
添加用户信息,提交代码会携带提交者身份信息
将工程添加到本地仓库
添加暂存区
提交
注意:提交时必须编写提交信息,不能添加空格。
共享版本库
本地用户提交先提交到本地版本库,如果需要提交到共享版本库,那么就需要push到远程共享版本库
这里如果填写码云的地址,就可以将代码直接上传到网上
克隆:类似svn中的checkout但是功能更加强大
选择git视图,创建共享版本库:
指定共享版本库位置,连接共享版本库。更新代码到本地仓库
创建新的本地仓库:
本地仓库创建完毕:
此操作是把远程仓库克隆到本地仓库。
接下来需要把本地仓库项目导入到本地eclipse中进行开发
直接导入项目:
更新
解决冲突
使用合并工具merge tool解决冲突
合并有冲突代码
添加排除文件(提交之前需要将不需要的文件剔除)
添加项目暂存区
提交本地仓库
Push远程仓库
Git服务器commit是提交到本地仓库,如果需要提交到远程服务共享版本库,需要push
远程仓库地址
聚合工程提交
聚合工程提交需要排除的文件较多,注意排除文件语法的写法