GIT分布式代码版本控制系统

1 常见版本控制软件

  • 本地版本控制系统:RCS
  • 集中化版本控制系统(CVCS):CVS、SVN(subversion),perforce
  • 分布式版本控制系统(DVCS):Git、Mercurial、Bazaar、Darcs

1.1 SVN与GIT比较

  • SVN:
  1. 优点:集中一台服务管理,实现多人共同开发,不同操作系统不同场地协同研发;避免频繁出现软件合并的风险
  2. 缺点:服务器存在单点问题,虽然有SVN主从技术保证数据备份,但当中央服务器出问题,期间所有开发无法协作
  • Git:
    相较于SVN,每个开发本地存在仓库,各开发人员代码仓库都可以实现同步,不存在单点问题;多用户修改同文件可以相互提交来修改冲突,最强大的功能是优秀的分支管理,不需要联网,可以脱机查看开发的版本历史,中央服务器宕机,任一开发本地都可以当做中央仓库进行服务

1.2 Git相关的代码上线场景

Dev+Ops:敏捷开发+运维自动化

  1. 从代码开发到自动化拉取到服务器,称为ci,持续构建
  2. 从测试完成到正式上线称为cd,持续部署/交付
  • PHP代码

开发人员(ci:代码上传至仓库)---->gitlab(代码仓库)---->jenkins(拉取代码部署至测试服务器)---->junit单元测试(代码版本构建完成,通知测试人员测试)---->项目发布
其中:jenkins处可以进行“代码质量管理”,对代码进行错误排查

  • JAVA代码

开发人员(ci:代码上传至仓库)---->gitlab(代码仓库)---->jenkins(拉取代码部署至maven服务器)---->maven服务器(打包过程:通过读取开发编写的pom.xml文件,获取依赖文件的了路径,将依赖与代码一起打包为war包,然后推送到测试服务器)---->junit单元测试(代码版本构建完成,通知测试人员测试)---->项目发布
其中:jenkins处可以进行“代码质量管理”,对代码进行错误排查

2 git安装

2.1 windows端

客户端下载地址:https://www.git-scm.com/downloads

2.2 linux端

基础环境
系统:centos 7.5.1804
内核:3.10.0-862.el7.x86_64

  • yum安装
yum -y install git
yum安装的版本会很低,不建议用
  • 源码安装
#安装依赖
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum -y install gcc perl-ExtUtils-MakeMaker

#编译安装
tar xf git-2.9.5.tar.gz -C /usr/src/
cd /usr/src/git-2.9.5/
./configure --prefix=/usr/local/git
make && make install

#连接git命令库
ln -sf /usr/local/git/bin/* /usr/bin/
ln -s /usr/libexec/git-core/* /usr/bin/

3 git工作流程及命令入门

3.1 git工作流程

  • 工作区:本地git项目目录
  • 暂存区
    将工作区里的变更部分(与上一版本不同的部分)暂时存储起来的地方
  • 本地仓库
    在本地创建的git版本仓库,用于提交工作区的变更。
  • 远程仓库
    github,gitlab或者其他开发者机器上所建立的一个仓库

工作区—add—>暂存区—commit—>本地仓库<—推送/拉取—>远程集中代码仓库

3.2 Git命令入门

3.2.1 git帮助文档

直接输入git可查看所有git命令
命令 ‘git help -a’ 和 ‘git help -g’ 显示可用的子命令和一些概念帮助
查看 ‘git help <命令>’ 或 ‘git help <概念>’ 以获取给定子命令或概念的帮助

3.2.2 git init 初始化工作目录

新建本地代码仓库需要初始化

##在Linux上
mkdir -p /mycode
cd /mycode
git init

#会出现.git目录
ls -la

3.2.3 git config 全局配置

代码提交时,需要标明身份,提交身份一致,会认为是一个用户提交的,所以需要设置全局变量,设置为自己的身份

#查看全局配置
git config --list  

#配置git使用用户
git config --global user.name "joe"
#配置git使用邮箱
git config --global user.email "1198563987@qq.com"   
#语法高亮
git config --global color.ui true   

3.2.4 git add 将变添加至暂存区

touch test.txt
git add test.txt
#跟踪该文件
#若设置为中文,会提示文件的具体状态

3.2.5 git commit将变更从暂存区提交到本地仓库

git commit -m "提交时需要写备注"

3.2.6 git remote 远程仓库管理

可以先在github上申请账户,建立仓库后来实验以下内容

添加远程仓库
#添加完后,远程推送时,可以指定仓库名推送
git remote add [选项] <自定义仓库名> <远程仓库URL>

查看git remote add相关命令
git remote add --help

查看远程仓库列表
git remote -v
#第一列为自定义仓库名,默认为origin

3.2.7 git push提交到远程仓库

git push -u <远程仓库名/URL> <分支名>
#远程推送需要验证仓库信息,仓库账号名和密码

3.2.8 git clone 克隆远程仓库到本地

mkdir -p /mycode
cd /mycode

git init 
git clone 远程仓库URL [仓库的分支名]
#不指定仓库名会下载项目目录
#下载后,会自动添加一个origin远程仓库

3.2.9 分步拉取远程仓库代码到本地

  • git fetch 将远程仓库的变更拉取到本地仓库
git fetch -u <仓库名> <分支>
#指定仓库及分支
  • checkout检查工作目录代码与本地仓库中的代码的差异
  • 执行fetch后,也可以用 git status 查看工作目录和本地仓库的版本差别
git checkout
#会根据现在所处的仓库和分支检测
  • 当checkout提示可以快进时,代表本地工作目录可以更新
  • git merge 将远程仓库的变更,更新到本地工作目录中
git merge 仓库名/master
#指定的仓库名是checkout检测出来的

3.2.10 get pull 一键拉取远程仓库代码到本地

拉取远程仓库代码到本地仓库,同时更新工作目录
可以近似认为git pull === git fetch + git merge

get pull -u <仓库名> <分支名>

3.2.11 git mv && git reset 暂存区文件的修改和撤销

#已经建立跟踪的文件要改名,需要使用git mv,会同时修改暂存区和工作目录的文件名
git mv 旧文件名 新文件名

#将暂存区的文件撤销(取消跟踪)
git reset benet.txt

3.2.12 git rm 提交文件删除变更到暂存区

需要删除本地仓库中已有的文件,需要使用git rm 删除文件

git rm 123
git commit -m "提交备注"
#先提交删除到暂存区,再提交到本地仓库

2.3.13 git diff 文件对比

git diff命令可以将本地工作目录中的文件与本地仓库中的文件进行对比

#往文件中写入新内容
echo "welcome" >> benet.txt 
#再查看差异
git diff benet.txt 

2.3.14 git log 查看git提交历史纪录

git log:查看提交历史记录 
git log -2 :查看最近2条记录
git log -p -1 :-p显示每次提交的内容差异
git log --stat -2 :stat简要显示数据增改行数,这样就能看到提交中修改过的内容
git log --pretty=oneline :一行显示提交的历史记录

3.3 还原数据 git log

3.3.1 Git还原历史数据

Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的hash字符串来区分每个提交版本(版本代号),另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD,上上一个版本则会叫做HEAD^,当然一般会用HEAD~5来表示往上数第五个提交版本。

#还原到上个版本
git reset --hard HEAD^

#利用git log找到需要还原的版本及版本代号,版本代号不用写完整,但需要保证不冲突
git reset --hard <版本代号>

3.3.2 还原到未来版本

当回滚之后,又需要回到未来版本,此时git log的日志也已经回到历史版本了,这个时候需要使用其他命令

#查看历史更新点(所有提交和回滚记录)
git reflog
#第一列就是版本代号的前面一部分

#查到目标版本代号,然后使用回滚
git reset --hard <版本代号>

3.3.3 Git的标签使用

给版本添加标签后,就可以指定标签回滚

git tag v1.0 : 给当前提交内容打一个标签(方便回滚) 
git tag : 查看当前所有的标签
git show v1.0 :查看当前1.0版本的详细信息
git tag v1.2 -m "描述"
git tag -d v1.0 :删除之前的v1.0标签

#回滚到v1.0版本
git reset --hard v1.0

3.4 .gitignore文件

避免项目无关文件推送到远程仓库,释放带宽,减少磁盘占用
.gitignore文件本身在项目一开始就会创建,并且可以被推送,当本地仓库有这个文件是,推送到服务器上的文件类型,就会被这个文件中的规则限制

  • gitignore文件匹配规则
  1. *.log 表示忽略项目中所有以.log结尾的文件
  2. 123?.log 表示忽略项目中所有以123加任意一个字符的文件
  3. /error.log 表示忽略根目录下的error.log文件
  4. **/java/ 匹配所有java目录下的所有文件
  5. !/error.log 表示在前面的匹配规则中,被忽略了的文件,你不想它被忽略,那么就可以在文件前加叹号

4 Git分支管理

4.1 分支管理工作流程

在工作中,为了保证master分支稳定,产品经理通常会从master分支上复制一份代码作为dev分支;
然后成员开发A在从dev分支上复制一份代码叫做michael;
然后成员开发B再从dev分支上复制一份代码叫做bob;
平时开发A和开发B推送和拉取代码都在自己的个人分支michael和bob上。
当一个新功能开发完毕,或者一个bug修改完毕以后。开发人员会先将代码变更推送到自己的个人分支,然后再把个人分支的变更合并到dev分支里;
当开发经理和测试人员拉取dev分支的代码进行测试以后,如果没问题,那么开发经理会把dev分支的变更合并进master版本;
最后,由于master版本新增了测试过的新功能,那么就需要进行项目发布或者代码上线了。

4.2 Git本地分支管理

  • 本地分支的创建与切换
git branch : 查看当前分支情况,当前分支前有*号
git branch linux : 创建分支,会完全复制当前分支的状态
git checkout: 检查本地分支与远程分支的变更差异
git checkout linux:切换分支
  • 在linux本地分支进行代码提交需要注意的点:
  1. 当linux的本地分支仓库和master本地分支仓库的代码不同时,如果你没把变更从暂存区提交到分支仓库,那么默认是不能切换分支的
  2. 如果本地分支仓库间的代码一致,那么就算不把变更提交到本地分支仓库,那么也可以切换分支,此时暂存区是共用的
  3. 切换分支前,要避免暂存区发生混乱,最好在切换前清空暂存区,或者提交改变

4.2.1 本地分支的合并与删除

  • 分支合并
想把linux的工作成果合并到master分支上; 
先切换到master分支,合并linux分支到master
git checkout linux
git merge linux 

确定合并完成后,可以放心的删除Linux分支
git branch -d linux
  • 分支删除
将linux分支删除(当前不能在linux分支上)
git branch -d linux
假如linux分支的变更没有合并到当前分支,那么必须用-D参数强制删除分支

4.2.2 本地分支代码冲突解决方案

当本地分支之间的同名目录-同名文件-同一行内容不同时,在进行分支合并时就会产生冲突,故为了解决代码冲突,就需要进行人工手动合并;
在工作中,为了尽量避免冲突,一般开发人员之间尽可能不负责相同的功能模块,也就不至于同时修改同一个文件。

当本地linux分支的benet.txt文件和本地master分支的benet.txt文件的某些代码产生冲突
如果此时,我们将本地linux分支的变更合并到本地master分支中,那么就会产生代码冲突

合并的时候,会报错,并且保留两个分支内容中的不同部分在产生冲突的文件中,然后我们可以进行手动修改

在报错内容中,HEAD表示当前所在分支的内容,隔离符号===后的内容属于被合并过来的内容,并且在最后也会提示从哪个分支合并来的

到了这里我们只能手动排除,选择保留后的内容,假如我们要保留linux分支的内容,然后再将工作目录中的变更提交即可人工解决代码冲突,并完成分支合并

修改后,再进行当前分支的本地仓库提交
git commit -m "修改了一个分支冲突"

4.3 GIT远程分支管理

4.3.1 将linux本地分支代码和标签推送到github远程仓库的linux分支

  • 将linux本地分支代码推送到github远程仓库的linux分支
#在Git01上,创建本地分支linux,复制master分支代码
git branch linux

#将工作目录代码的benet.txt文件修改后提交到本地linux分支
echo "远程分支提交测试" >> benet.txt 
git add *
git commit -m "远程分支提交测试"

#将本地linux分支推送到远程github的linux分支
git push test linux

#然后可以去远程仓库查看是否增加了新分支以及新内容的验证
  • 将本地标签推送到github远程仓库
#创建本地标签,并推送到github
git tag v1.0 -m "这就是一个测试"

git push test v1.0
#然后去github上查看是否创建了标签

4.3.2 从github远程仓库克隆一个linux分支到本地linux分支

  • 克隆远程仓库master分支后,通过checkout切换成远程linux分支
#克隆远程仓库到本地
git clone 远程仓库地址
#默认克隆master,可以切换成指定分支linux

#查看github远程仓库分支情况
git branch -a

#检查origin/linux远程分支
git checkout origin/linux
#其实是记录了linux分支的相关内容,这个时候创建linux分支,不会复制本地master分支的内容,而是使用远程linux分支的内容

#创建本地linux分支
git branch linux
#再切换到本地linux分支
git checkout linux
#查看代码,可以发现是复制了远程仓库的代码
  • 通过git clone -b linux URL直接指定远程仓库分支进行克隆
#克隆一个远程分支linux到本地工作目录(-b linux指定分支)
git clone -b linux 远程仓库地址

5 建立linux系统上的远程仓库

创建一个linux系统上的,没有web界面,简单的远程仓库

#创建一个普通用户,用于管理仓库
useradd git
echo "666666" | passwd --stdin git

#切换为普通用户git
su git
cd ~
mkdir -p /remote/jcjc

#添加--bare参数进行初始化仓库,这样这个目录只能当做代码仓库,而不能在此目录下进行代码提交
git --bare init
#此目录下会创建仓库相关的目录和文件,而不会创建.git(本地仓库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值