当前位置: 首页 > 运维技术 > 正文

Git 版本管理工具详解及配置

Mr.linus 发表于2017年10月27日 15:09

一、关于版本控制

        什么是版本控制?我真的需要吗?版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。在本书所展示的例子中,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制。

        如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能)。采用版本控制系统 (VCS)是个明智的选择。有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出最 后是谁修改了哪个地方,从而导致出现怪异问题,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改 的改删的删,你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。

本地版本控制系统


           许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异(见图 1-1)。

Git 版本管理工具 环境部署 第1张

        其中最流行的一种叫做 rcs,现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次 修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。

集中化的版本控制系统

        接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这 已成为版本控制系统的标准做法(见图 1-2)。


Git 版本管理工具 环境部署 第2张



        这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。

        事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要 是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端 提取出来的某些快照数据除外,但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项 目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。


分布式版本控制系统

        于是分布式版本控制系统( Distributed Version Control System,简称 DVCS )面世了。在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜 像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份(见图 1-3)。

Git 版本管理工具 环境部署 第3张

        更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。(来源:http://blog.jobbole.com/25775/)

常见的版本管理软件:

Git 版本管理工具 环境部署 第4张

版本管理的发展过程:

Git 版本管理工具 环境部署 第5张

常用术语:

•分支(Branch): 在一个时间点,复制一份处于版本控制之下的文件,从这之后,这两份拷贝就可以独立的互不干扰的进行各自开发。

•取出(Check-out): 一次“取出”,就是在本地创建一份仓库的工作拷贝。
•提交(Commit): 一次“提交”,将本地的修改写回到仓库或合并到仓库。
•冲突(Conflict): 当开发者们同时提交对同一文件的修改,而且版本系统不能把它们合并到一起,就会引起冲突,就需要人工来进行合并。
•合并(Merge): 合并就是把所有对文件的修改统一到文件里
•仓库(Repository): 仓库就是当前的和历史的处于版本控制之下的文件所在的地方,通常在服务器端。
• 工作版本(Working copy):从档案库中取出一个本地端的复制,所有在档案库中的档案更动,都是从一个工作版本中修改而来的,这也是这名称的由来。


二、git简介

        Git是一个免费的开放源码的 分布式版本控制系统,用于处理从小到大的项目,速度和效率的一切。

        Git 易于学习,具有 闪电般快速的性能,占地面积小。它超越了像Subversion,CVS,Perforce和ClearCase这样的SCM工具,具有便宜的本地分支,便利的分段区域和 多个工作流等功能。

git诞生:

•2002年以前
–Linus个人以diff方式管理
•2002年至2005年
–BitMover公司的BitKeeper
•2005年以后
–Linus两个月开发出Git

git发展:


•大部份开源软件
•Github.com
•Gitcafe.com
•Code.csdn.net
•Coding.net


git设计目标:

Git 版本管理工具 环境部署 第6张

git工作模式:

         个人计算机从版本服务器同步

         90%以上的操作在个人计算机

         添加文件

         修改文件

         提交变更

         查看版本历史等

         将本地修改传送

         到版本服务器


git文件存储:


Git 版本管理工具 环境部署 第7张

二、git基础

git文件状态:
Git 版本管理工具 环境部署 第8张

GIT文件

    已被版本库管理的文件 

已修改

    在工作目录修改GIT文件 

已暂存 

    对已修改的文件执行git暂存操作,将文件存入了暂存区 

已提交 

    将已暂存的文件执行git提交操作,将文件存入对象库

本地服务器与服务器版本库

Git 版本管理工具 环境部署 第9张

git安装

1、安装依赖

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y

2、编译安装

wget https://github.com/git/git/archive/v2.7.4.zip
unzip v2.7.4.zip
cd git-2.7.4

make prefix=/usr/local/git all
make prefix=/usr/local/git install
rm -rf /usr/bin/git
ln -s /usr/local/git/bin/git /usr/bin/git
git --version

配置用户信息

        这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

[root@linux-node1 test]#  git config --global user.name "zhangyang"
[root@linux-node1 test]# git config --global user.email 992747643@qq.com

查看配置信息:

[root@linux-node1 test]# git config --list
user.name=zhangyang
user.email=992747643@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true

三、git的相关操作

1、创建版本库

[root@linux-node1 ~]# mkdir project
[root@linux-node1 ~]# cd project/
[root@linux-node1 project]# git init
初始化空的 Git 仓库于 /root/project/.git/
[root@linux-node1 project]# ls -la
总用量 4
drwxr-xr-x   3 root root   17 5月   8 21:38 .
dr-xr-x---. 15 root root 4096 5月   8 21:38 ..
drwxr-xr-x   7 root root  111 5月   8 21:38 .git

2、添加到版本库

[root@linux-node1 project]# touch test1
[root@linux-node1 project]# git add test1 
[root@linux-node1 project]# git status
位于分支 master

初始提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)

	新文件:   test1

3、提交到版本库

[root@linux-node1 project]# git commit -m "first commit"
[master(根提交) fbaa9b5] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test1
[root@linux-node1 project]# git status
位于分支 master
无文件要提交,干净的工作区

4、版本回滚

[root@linux-node1 project]# echo "v1" >test1.txt
[root@linux-node1 project]# cat test1.txt 
v1
[root@linux-node1 project]# git add test1.txt 
[root@linux-node1 project]# git commit -m "first commit v1"
[master(根提交) e915a51] first commit v1
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
 
[root@linux-node1 project]# echo "v2" >test1.txt
[root@linux-node1 project]# cat test1.txt 
v2
[root@linux-node1 project]# git add test1.txt 
[root@linux-node1 project]# git commit -m "commit v2"
[master cc3a990] commit v2
 1 file changed, 1 insertion(+), 1 deletion(-)
 
[root@linux-node1 project]# git log
commit cc3a99027ef1615e9f4ec92dee6522f8f764e3fa
Author: zhangyang <992747643@qq.com>
Date:   Mon May 8 21:45:04 2017 +0800

    commit v2

commit e915a51e7497ce3319f0cce4f97510cfd6269b46
Author: zhangyang <992747643@qq.com>
Date:   Mon May 8 21:44:04 2017 +0800

    first commit v1

注意:如果嫌输出信息太多可以加上--pretty=oneline参数

[root@linux-node1 project]# git log --pretty=oneline
cc3a99027ef1615e9f4ec92dee6522f8f764e3fa commit v2
e915a51e7497ce3319f0cce4f97510cfd6269b46 first commit v1

回退到 v1

[root@linux-node1 project]# git reset --hard e915a51e7497
HEAD 现在位于 e915a51 first commit v1
[root@linux-node1 project]# cat test1.txt 
v1
[root@linux-node1 project]# git log
commit e915a51e7497ce3319f0cce4f97510cfd6269b46
Author: zhangyang <992747643@qq.com>
Date:   Mon May 8 21:44:04 2017 +0800

    first commit v1

注意:git  reset 三个参数

--soft       缓存区和工作目录都不会改变。

--mixed   默认选项,缓存区和你指定的提交同步,单工作目录不受限制影响。

--hard    缓存区和工作目录都同步到你的提交。

5、移除文件

[root@linux-node1 project]# git rm test1.txt 
rm 'test1.txt'
[root@linux-node1 project]# ll
总用量 0
[root@linux-node1 project]# git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	删除:     test1.txt

--cache  从暂缓区中移除

6、修改文件

[root@linux-node1 project]# cat test1.txt 
v1
[root@linux-node1 project]# echo "m v1" >test1.txt
[root@linux-node1 project]# cat test1.txt 
m v1
[root@linux-node1 project]# git add test1.txt 
[root@linux-node1 project]# git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     test1.txt

[root@linux-node1 project]# git commit -m "commit m v1"
[master 1b1a8a6] commit m v1
 1 file changed, 1 insertion(+), 1 deletion(-)

7、撤销修改

[root@linux-node1 project]# cat test1.txt 
m v1
[root@linux-node1 project]# echo "m2 v1" >test1.txt
[root@linux-node1 project]# cat test1.txt 
m2 v1
[root@linux-node1 project]# git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     test1.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@linux-node1 project]# git checkout -- test1.txt 
[root@linux-node1 project]# git status
位于分支 master
无文件要提交,干净的工作区
[root@linux-node1 project]# cat test1.txt 
m v1

8.创建分支并切换分支

[root@linux-node1 project]# git status
位于分支 master
无文件要提交,干净的工作区
[root@linux-node1 project]# git checkout -b slave
切换到一个新分支 'slave'
[root@linux-node1 project]# git branch --list
  master
* slave

git branch 其他操作

用法:git branch [<选项>] [-r | -a] [--merged | --no-merged]
  或:git branch [<选项>] [-l] [-f] <分支名> [<起始点>]
  或:git branch [<选项>] [-r] (-d | -D) <分支名>...
  或:git branch [<选项>] (-m | -M) [<旧分支>] <新分支>
  或:git branch [<选项>] [-r | -a] [--points-at]

通用选项
    -v, --verbose         显示哈希值和主题,若参数出现两次则显示上游分支
    -q, --quiet           不显示信息
    -t, --track           设置跟踪模式(参见 git-pull(1))
    --set-upstream        改变上游信息
    -u, --set-upstream-to <upstream>
                          change the upstream info
    --unset-upstream      Unset the upstream info
    --color[=<何时>]      使用彩色输出
    -r, --remotes         作用于远程跟踪分支
    --contains <提交>     只打印包含该提交的分支
    --abbrev[=<n>]        用 <n> 位数字显示 SHA-1 哈希值

具体的 git-branch 动作:
    -a, --all             列出远程跟踪及本地分支
    -d, --delete          删除完全合并的分支
    -D                    删除分支(即使没有合并)
    -m, --move            移动/重命名一个分支,以及它的引用日志
    -M                    移动/重命名一个分支,即使目标已存在
    --list                列出分支名
    -l, --create-reflog   创建分支的引用日志
    --edit-description    标记分支的描述
    -f, --force           强制创建、移动/重命名、删除
    --merged <提交>       只打印已经合并的分支
    --no-merged <提交>    只打印尚未合并的分支
    --column[=<风格>]     以列的方式显示分支
    --sort <key>          排序的字段名
    --points-at <对象>    只打印指向该对象的分支

9、git merge

[root@linux-node1 project]# echo "v1" >test2.txt 
[root@linux-node1 project]# git add test2.txt 
[root@linux-node1 project]# git commit -m "first commit  v1"
[slave f3a6fe9] first commit  v1
 1 file changed, 1 insertion(+)
 create mode 100644 test2.txt
[root@linux-node1 project]# git status
位于分支 slave
无文件要提交,干净的工作区
[root@linux-node1 project]# git checkout master
切换到分支 'master'
[root@linux-node1 project]# git merge slave
更新 1b1a8a6..f3a6fe9
Fast-forward
 test2.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test2.txt

git工作流程图:

Git 版本管理工具 环境部署 第10张

四、git常用命令

Git 版本管理工具 环境部署 第11张

全文完
本文标签: git版本管理工具
本文标题: Git 版本管理工具详解及配置
本文链接: http://www.90qj.com/m/?post=449

〓 随机文章推荐

共有6263阅 / 0我要评论
  1. 还没有评论呢,快抢沙发~

发表你的评论吧返回顶部

!评论内容需包含中文


请勾选本项再提交评论