文章目录
- 1 常见版本控制软件
- 2 git安装
- 3 git工作流程及命令入门
- 3.1 git工作流程
- 3.2 Git命令入门
- 3.2.1 git帮助文档
- 3.2.2 git init 初始化工作目录
- 3.2.3 git config 全局配置
- 3.2.4 git add 将变添加至暂存区
- 3.2.5 git commit将变更从暂存区提交到本地仓库
- 3.2.6 git remote 远程仓库管理
- 3.2.7 git push提交到远程仓库
- 3.2.8 git clone 克隆远程仓库到本地
- 3.2.9 分步拉取远程仓库代码到本地
- 3.2.10 get pull 一键拉取远程仓库代码到本地
- 3.2.11 git mv && git reset 暂存区文件的修改和撤销
- 3.2.12 git rm 提交文件删除变更到暂存区
- 2.3.13 git diff 文件对比
- 2.3.14 git log 查看git提交历史纪录
- 3.3 还原数据 git log
- 3.4 .gitignore文件
- 4 Git分支管理
- 5 建立linux系统上的远程仓库
1 常见版本控制软件
- 本地版本控制系统:RCS
- 集中化版本控制系统(CVCS):CVS、SVN(subversion),perforce
- 分布式版本控制系统(DVCS):Git、Mercurial、Bazaar、Darcs
1.1 SVN与GIT比较
- SVN:
- 优点:集中一台服务管理,实现多人共同开发,不同操作系统不同场地协同研发;避免频繁出现软件合并的风险
- 缺点:服务器存在单点问题,虽然有SVN主从技术保证数据备份,但当中央服务器出问题,期间所有开发无法协作
- Git:
相较于SVN,每个开发本地存在仓库,各开发人员代码仓库都可以实现同步,不存在单点问题;多用户修改同文件可以相互提交来修改冲突,最强大的功能是优秀的分支管理,不需要联网,可以脱机查看开发的版本历史,中央服务器宕机,任一开发本地都可以当做中央仓库进行服务
1.2 Git相关的代码上线场景
Dev+Ops:敏捷开发+运维自动化
- 从代码开发到自动化拉取到服务器,称为ci,持续构建
- 从测试完成到正式上线称为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文件匹配规则
- *.log 表示忽略项目中所有以.log结尾的文件
- 123?.log 表示忽略项目中所有以123加任意一个字符的文件
- /error.log 表示忽略根目录下的error.log文件
- **/java/ 匹配所有java目录下的所有文件
- !/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本地分支进行代码提交需要注意的点:
- 当linux的本地分支仓库和master本地分支仓库的代码不同时,如果你没把变更从暂存区提交到分支仓库,那么默认是不能切换分支的
- 如果本地分支仓库间的代码一致,那么就算不把变更提交到本地分支仓库,那么也可以切换分支,此时暂存区是共用的
- 切换分支前,要避免暂存区发生混乱,最好在切换前清空暂存区,或者提交改变
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(本地仓库)