开始之前先看一个没有版本控制的例子
本地版本控制系统许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
在这类系统中,像Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
官网:Git
git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
Git 官方中文手册 Git - Book
自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社区中长期遭受质疑。在Linux社区中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来作为Linux核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。
2005年,安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的授权。Linux内核开发团队与BitMover公司进行蹉商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间,编写出第一个git版本
[root@git ~]# rpm -qa centos-release
centos-release-7-4.1708.el7.centos.x86_64
[root@git ~]# uname -a
Linux gitlab 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@git ~]# getenforce
Disabled
[root@git ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
本文使用的linux系统均为该系统
本文使用的windows系统为 Microsoft Windows [版本 10.0.15063]
centos 自带git
[root@git ~]# rpm -qa git
git-1.8.3.1-11.el7.x86_64
安装方法
[root@git ~]# yum install git -y
编译安装可以安装较新版本的git
Git下载地址: Releases · git/git · GitHub
# 安装依赖关系
[root@git ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker
# 编译安装
[root@git ~]# tar -zxf git-2.0.0.tar.gz
[root@git ~]# cd git-2.0.0
[root@git ~]# ./configure --prefix=/usr/local/git # 没有文件可以略过
[root@git ~]# make
[root@git ~]# make install
命令集
git config --global user.name "username" #配置git使用用户 git config --global user.email "[email protected]" #配置git使用邮箱 git config --global color.ui true #语法高亮 git config --list # 查看全局配置
配置过程
[root@gitlab ~]# git config --global user.name "newrain" #配置git使用用户
[root@gitlab ~]# git config --global user.email "[email protected]" #配置git使用邮箱
[root@gitlab ~]# git config --global color.ui true #语法高亮
[root@gitlab ~]# git config --list # 查看全局配置
user.name=newrain
[email protected]
color.ui=true
生成的配置文件
[root@gitlab ~]# cd
[root@gitlab ~]# cat .gitconfig
[user]
name = newrain
email = [email protected]
[color]
ui = true
使用Git时需要获取帮助,有三种方法可以找到Git命令的使用手册:
git helpgit --help man git-
例如,要想获得配置命令的手册,执行
git help config
[root@gitlab ~]# useradd git
[root@gitlab ~]# passwd git
[root@gitlab ~]# mkdir /git-root/
[root@gitlab ~]# cd /git-root/
[root@gitlab git-root]# git init --bare shell.git
Initialized empty Git repository in /git-root/shell.git/
[root@gitlab git-root]# chown -R git:git shell.git
[root@gitlab opt]# ssh-keygen
[root@gitlab opt]# ssh-copy-id [email protected]
[root@gitlab opt]# git clone [email protected]:/git-root/shell.git
[root@gitlab opt]# ls
rh shell
[root@gitlab opt]# cd shell/
[root@gitlab shell]# vim test1.sh
[root@gitlab shell]# git add test1.sh
[root@gitlab shell]# git commit -m 'first commit'
[master (root-commit) 33c5fbf] first commit
1 file changed, 2 insertions(+)
create mode 100644 test1.sh
[root@gitlab shell]# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/git-root/shell.git
* [new branch] master -> master
[root@gitlab shell]#
[root@git objects]# tree
.
├── 5d
│ └── 0921ada98b7d356699974ca580a3a54dd95590
├── 70
│ └── 8232789ba22b76030c944bea934bfc23da9c3d
├── a0
│ ├── 8d7672007b588ed57414127b845e410eed3af0
│ └── d08fd1a09409e5bba8cc8d079b47ec92e4d4b1
├── a1
│ └── 06dd26e56429e9bc2d624f748b88ce3462dec8
├── bd
│ └── 133c756c8cd6f3c17e49afdb4999a5bbc02c0e
├── info
└── pack
#显示文件内容
[root@git objects]# git cat-file -p 5d0921ada
junjiezhenshuai
# 显示文件类型
[root@git objects]# git cat-file -t 5d0921ada
blob
# 显示文件大小
[root@git objects]# git cat-file -s 5d0921ada
16
常用命令说明
命令 | 命令说明 |
---|---|
#add | 添加文件内容至索引 |
bisect | 通过二分查找定位引入 bug 的变更 |
#branch | 列出、创建或删除分支 |
#checkout | 检出一个分支或路径到工作区 |
#clone | 克隆一个版本库到一个新目录 |
#commit | 记录变更到版本库 |
#diff | 显示提交之间、提交和工作区之间等的差异 |
fetch | 从另外一个版本库下载对象和引用 |
grep | 输出和模式匹配的行 |
#init | 创建一个空的 |
#log | 显示提交日志 |
#merge | 合并两个或更多开发历史 |
#mv | 移动或重命名一个文件、目录或符号链接 |
#pull | 获取并合并另外的版本库或一个本地分支 |
#push | 更新远程引用和相关的对象 |
rebase | 本地提交转移至更新后的上游分支中 |
#reset | 重置当前HEAD到指定状态 |
#rm | 从工作区和索引中删除文件 |
show | 显示各种类型的对象 |
#status | 显示工作区状态 |
#tag | 创建、列出、删除或校验一个GPG签名的 tag 对象 |
常用操作示意图
文件的状态变化周期