Git
版本控制
介绍
- 版本:
- centos6.9,centos7.3,centos7.5这些属于操作系统的版本
- nginx-1.10,nginx1.14这些属于软件的版本
- 一个配置文件或一个代码文件被多次修改,也会有对应的版本
- 版本控制:版本控制软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理活动,追踪多个版本的开发和维护活动,及时发布软件。
常见开源版本控制系统
-
svn:集中式版本控制系统
速度慢,必须联⽹
只有⼀个中央数据仓库,如果中央数据仓库挂了或者⽆法访问,所有的使⽤者⽆法使⽤SVN,⽆法进⾏提交或备份操作
-
git:分布式版本控制系统
⽆中央服务器,每个⼈的电脑都是⼀个完整的版本库
通常有⼀台充当“中央服务器”的电脑,仅仅作为⽅便“交换”⼤家的修改
- 腾讯tapd, 百度icafe, 阿里云效等也是一站式的版本控制
Git使用
安装
[root@server1 ~]# yum install -y git
[root@server1 ~]# git --version
git version 1.8.3.1
身份设置
[root@server1 ~]# git config --global user.name "xiaotanggao"
[root@server1 ~]# git config --global user.email "xiaotanggao@qq.com"
[root@server1 ~]# git config --global color.ui true
[root@server1 ~]# git config --list
user.name=xiaotanggao
user.email=xiaotanggao@qq.com
color.ui=true
创建本地仓库
-
仓库分为**本地仓库与远程仓库**
-
工作目录==(working directory): 也可叫**工作区**. 是存放项目代码文件的一个目录。
-
仓库(repository) : 也可叫**版本库**. 在git init命令初始化工作目录后会产生一个隐藏的子目录.git, 可以将其理解为git的仓库或版本库。
-
创建步骤
[root@server1 ~]# mkdir GitTest
[root@server1 ~]# cd GitTest/
[root@server1 GitTest]# git init
初始化空的 Git 版本库于 /root/GitTest/.git/
[root@server1 GitTest]# ls .git/
branches config description HEAD hooks info objects refs
暂存区
- 暂存区(stage或index): 也有叫**缓存区**,临时保存你的改动。如果在工作目录创建了一个新文件,需要将新文件添加到暂存区,之后才能commit提交
- 添加文件到暂存区步骤
准备文件
[root@server1 GitTest]# vim test.py
[root@server1 GitTest]# cat test.py
print("hello world")
查看文件状态
[root@server1 GitTest]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# test.py
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
上传到暂存区(撤出暂存区:git rm --cached test.py)
[root@server1 GitTest]# git add test.py
[root@server1 GitTest]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: test.py
#
查看暂存区列表
[root@server1 GitTest]# strings .git/index
DIRC
test.py
版本库
- 提交到版本库
查看状态
[root@server1 GitTest]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: test.py
#
提交
[root@server1 GitTest]# git commit -m "第一次提交test.py"
[master(根提交) 867a299] 第一次提交test.py
1 file changed, 1 insertion(+)
create mode 100644 test.py
[root@server1 GitTest]# git status
# 位于分支 master
无文件要提交,干净的工作区
修改原文件并添加文件
[root@server1 GitTest]# vim test.py
[root@server1 GitTest]# vim test1.py
[root@server1 GitTest]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: test.py
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# test1.py
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
上传暂存区
[root@server1 GitTest]# git add *
[root@server1 GitTest]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: test.py
# 新文件: test1.py
#
再次提交
[root@server1 GitTest]# git commit -m "第二次提交test.py(修改原文件且增加了一个文件tst1.py)"
[master 624a44a] 第二次提交test.py(修改原文件且增加了一个文件tst1.py)
2 files changed, 2 insertions(+)
create mode 100644 test1.py
[root@server1 GitTest]# git status
# 位于分支 master
无文件要提交,干净的工作区
第三次修改并提交
[root@server1 GitTest]# vim test.py
[root@server1 GitTest]# git commit -a -m "第三次提交test.py"
[master abff75e] 第三次提交test.py
1 file changed, 1 insertion(+)
[root@server1 GitTest]# git status
# 位于分支 master
无文件要提交,干净的工作区
版本切换
查看提交历史
[root@server1 GitTest]# git log
commit abff75e4dbd696e79f258fa7f05278cb22b90afe
Author: xiaotanggao <xiaotanggao@qq.com>
Date: Sat Aug 21 13:12:25 2021 +0800
第三次提交test.py
commit 624a44a52a3c26b34b5096c7ce2763c001eb0389
Author: xiaotanggao <xiaotanggao@qq.com>
Date: Sat Aug 21 12:53:47 2021 +0800
第二次提交test.py(修改原文件且增加了一个文件tst1.py)
commit 867a299b18020fd10710b240bcc53525530ea155
Author: xiaotanggao <xiaotanggao@qq.com>
Date: Sat Aug 21 12:44:23 2021 +0800
第一次提交test.py
简洁查看提交历史
[root@server1 GitTest]# git log --pretty=oneline
abff75e4dbd696e79f258fa7f05278cb22b90afe 第三次提交test.py
624a44a52a3c26b34b5096c7ce2763c001eb0389 第二次提交test.py(修改原文件且增加了一个文件tst1.py)
867a299b18020fd10710b240bcc53525530ea155 第一次提交test.py
更加简洁查看修改历史
[root@server1 GitTest]# git reflog
abff75e HEAD@{1}: commit: 第三次提交test.py
624a44a HEAD@{2}: commit: 第二次提交test.py(修改原文件且增加了一个文件tst1.py)
867a299 HEAD@{3}: commit (initial): 第一次提交test.py
通过编号(可不写全,能区分即可),选择版本回退
[root@server1 GitTest]# git reset --hard 867a
HEAD 现在位于 867a299 第一次提交test.py
[root@server1 GitTest]# cat test.py
print("hello world")
版本控制-修改|删除
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0KViyhP-1636788975944)(images/image-20211112163858972.png)]
-
撤销修改
-
代码在工作区
- 开发者记得修改了哪些代码:直接修改
- 开发者不记得修改了哪些代码:同步暂存区内容
git checkoue -- 文件名
-
代码提交到暂存区
-
暂存区同步版本库内容
git reset HEAD 文件名
;工作区再同步暂存区内容
git checkoue -- 文件名
-
-
代码提交了版本库
- 版本回退
git reset --hard 版本号
- 版本回退
-
-
误删恢复
- 文件在工作区
- 凉凉
- 文件在暂存区
- 同步暂存区内容
git checkoue -- 文件名
- 同步暂存区内容
- 文件在工作区
-
文件删除
-
文件在工作区
rm -rf 文件名
-
文件在暂存区
-
删除本地文件
rm -rf 文件名
删除暂存区文件
git rm 文件名
-
-
文件在版本库
-
删除本地文件
rm -rf 文件名
删除暂存区文件
git rm 文件名
提交删除
git commit -m "描述"
-
-
git分支管理
- 先来考虑一个问题: 开发者A开发软件的某一个功能模块, 还没有开发完成,但害怕进度丢失就提交。假设另一位开发者B并不知道A没有完成, 而直接使用了A开发的文件,这造成了问题。
- 解决方法: 开发者A创建一个属于自己的分支,这个分支只属于A,不会影响其他人。开发完成后,合并到项目主分支即可。
查看分支
[root@server1 GitTest]# git branch
* master
创建分支
[root@server1 GitTest]# git branch dev
[root@server1 GitTest]# git branch
dev
* master
切换分支
[root@server1 GitTest]# git checkout dev
#切换到分支 'dev'
删除分支
[root@server1 GitTest]# git branch -d dev
已删除分支 dev(曾为 cc186ed)。
- 合并分支
在dev分支创建文件并提交
[root@server1 GitTest]# vim 1.py
[root@server1 GitTest]# git add 1.py
[root@server1 GitTest]# git commit -m "创建1.py文件"
切回master分支
[root@server1 GitTest]# git checkout master
#切换到分支 'master'
[root@server1 GitTest]# ls
test.py
合并分支
[root@server1 GitTest]# git merge dev
#更新 867a299..4c1ffaf
Fast-forward
1.py | 1 +
1 file changed, 1 insertion(+)
create mode 100644 1.py
[root@server1 GitTest]# ls
1.py test.py
- 分支冲突
在dev分支修改文件,并提交
[root@server1 GitTest]# git checkout dev
切换到分支 'dev'
[root@server1 GitTest]# echo "hello" >> 1.py
[root@server1 GitTest]# git add *
[root@server1 GitTest]# git commit -m "1.py文件添加了hello"
[dev cc186ed] 1.py文件添加了hello
1 file changed, 1 insertion(+)
在master分支修改文件并提交
[root@server1 GitTest]# git checkout master
切换到分支 'master'
[root@server1 GitTest]# echo "world" >> 1.py
[root@server1 GitTest]# git add *
[root@server1 GitTest]# git commit -m "1.py文件添加了world"
[master e2b8d33] 1.py文件添加了world
1 file changed, 1 insertion(+)
合并分支
[root@server1 GitTest]# git merge dev
自动合并 1.py
冲突(内容):合并冲突于 1.py
自动合并失败,修正冲突然后提交修正的结果。
[root@server1 GitTest]# cat 1.py
1
<<<<<<< HEAD
world
=======
hello
>>>>>>> dev
解决冲突(手动删除<<<<<<< HEAD,=======,>>>>>>> dev即可)
[root@server1 GitTest]# vim 1.py
[root@server1 GitTest]# cat 1.py
1
world
hello
[root@server1 GitTest]# git add *
[root@server1 GitTest]# git commit -m "解决冲突"
[master 4441899] 解决冲突
[root@server1 GitTest]# git merge dev
Already up-to-date.
Github
介绍
- GitHub故名思义是一个git版本库的托管服务,是目前全球最大的软件仓库,拥有成千上百万的开发者用户,也是软件开发和寻找资源的最佳途径,GitHub不仅可以托管各种git版本库,还拥有更美观的web界面,你的代码可以被任何人克隆,使得开发者为开源贡献代码变得更加容易,当然也可以付费购买私有库,这样高性价比的私有库真的是帮助到了很多企业
注册github账号
- 具体步骤略(下为创建成功界面)
创建项目
配置免密
- 生成ssh密钥对,复制公钥
[root@server1 my_git]# ssh-keygen
[root@server1 my_git]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0KQxG1Zox/Ou0NzEDxdAQDqlPqjjjqMRV/rEIL9x3Czo+5U+EFonRejq4D04+8fJATbntjYmvxGDtJyVKJOxX6opfwYanZ5wig+EEValtSigjR/W0YGfb50dr0FmVdc8WJHQjSsP323qzCbcq8JpnlDiD/4ombzdPujbsohp0m+FpS5SGmz9pPgL6zuDhpBEQwXI41jIQ7Fd0MKdNmZFsvWyfmYSmzwmvAwaNPNOatBxGExaHH43sPnvEH8ygBo9z6KA2EPeJU123cb0f2mcOpIEYZ4ACl1ePReT2jEPGHoYzp3t9rY0Edo6jgNXNx4upSinM2l6R2lfLE25SSbz/ root@server1
- github上添加公钥
- 取名+粘贴公钥
使用github远程仓库
- 克隆地址
- 准备本地仓库
[root@server1 ~]# mkdir my_git
[root@server1 ~]# cd my_git/
[root@server1 my_git]# git init
初始化空的 Git 版本库于 /root/my_git/.git/
- 连接远程仓库
[root@server1 my_git]# git clone git@github.com:xiaotanggao3/daniel_project.git
正克隆到 'daniel_project'...
The authenticity of host 'github.com (20.205.243.166)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,20.205.243.166' (RSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), done.
[root@server1 my_git]# ls
daniel_project README.txt
- 提交到远程仓库
[root@server1 my_git]# cd daniel_project/
[root@server1 daniel_project]# vim hello.txt
[root@server1 daniel_project]# git add hello.txt
[root@server1 daniel_project]# git commit -m "第一次提交"
[main 8a09898] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
[root@server1 daniel_project]# git push -u origin master
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (7/7), 592 bytes | 0 bytes/s, done.
Total 7 (delta 0), reused 2 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote: https://github.com/xiaotanggao3/daniel_project/pull/new/master
remote:
To git@github.com:xiaotanggao3/daniel_project.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
- 验证
github分支
- github上创建新分支
- 本地分支内容上传
[root@server1 test]# git branch dev
[root@server1 test]# git checkout dev
切换到分支 'dev'
[root@server1 test]# echo "linux" >> 3.py
[root@server1 test]# git add 3.py
[root@server1 test]# git commit -m "第三次提交3.py"
[dev 833317b] 第三次提交3.py
1 file changed, 1 insertion(+)
create mode 100644 3.py
[root@server1 test]# git push -u origin dev
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 311 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev' on GitHub by visiting:
remote: https://github.com/xiaotanggao3/daniel_project/pull/new/dev
remote:
To git@github.com:xiaotanggao3/daniel_project.git
* [new branch] dev -> dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
- 分支合并
gitlab
gitlab安装
-
清华源下载:https://mirrors.tuna.tsinghua.edu.cn/;搜索gitlab,下载ce社区版
-
安装与配置
[root@server2 ~]# yum install -y lrzsz
[root@server2 ~]# rz
[root@server2 ~]# yum install -y gitlab-ce-11.8.2-ce.0.el7.x86_64.rpm
配置:修改成gitlab服务器的IP地址,对外服务
[root@server2 ~]# vim /etc/gitlab/gitlab.rb
[root@server2 ~]# cat /etc/gitlab/gitlab.rb |grep -Ev '^#|^$'
external_url 'http://192.168.139.20'
初始化(3分钟左右)
[root@server2 ~]# gitlab-ctl reconfigure
查看状态
[root@server2 ~]# gitlab-ctl status
run: alertmanager: (pid 3735) 18s; run: log: (pid 3468) 40s
run: gitaly: (pid 3552) 22s; run: log: (pid 2766) 122s
run: gitlab-monitor: (pid 3606) 20s; run: log: (pid 3352) 54s
run: gitlab-workhorse: (pid 3570) 21s; run: log: (pid 3118) 79s
run: logrotate: (pid 3222) 69s; run: log: (pid 3272) 66s
run: nginx: (pid 3141) 75s; run: log: (pid 3187) 72s
run: node-exporter: (pid 3595) 21s; run: log: (pid 3315) 60s
run: postgres-exporter: (pid 3750) 18s; run: log: (pid 3518) 34s
run: postgresql: (pid 2775) 119s; run: log: (pid 2894) 116s
run: prometheus: (pid 3706) 19s; run: log: (pid 3422) 46s
run: redis: (pid 2564) 127s; run: log: (pid 2585) 126s
run: redis-exporter: (pid 3614) 20s; run: log: (pid 3385) 50s
run: sidekiq: (pid 3060) 87s; run: log: (pid 3081) 86s
run: unicorn: (pid 3008) 93s; run: log: (pid 3057) 92s
- gitlab登陆与设置:浏览器访问
gitlab简单使用
- 配置免密
[root@server1 ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0KQxG1Zox/Ou0NzEDxdAQDqlPqjjjqMRV/rEIL9x3Czo+5U+EFonRejq4D04+8fJATbntjYmvxGDtJyVKJOxX6opfwYanZ5wig+EEValtSigjR/W0YGfb50dr0FmVdc8WJHQjSsP323qzCbcq8JpnlDiD/4ombzdPujbsohp0m+FpS5SGmz9pPgL6zuDhpBEQwXI41jIQ7Fd0MKdNmZFsvWyfmYSmzwmvAwaNPNOatBxGExaHH43sPnvEH8ygBo9z6KA2EPeJU123cb0f2mcOpIEYZ4ACl1ePReT2jEPGHoYzp3t9rY0Edo6jgNXNx4upSinM2l6R2lfLE25SSbz/ root@server1
- 创建仓库
- 按说明操作
设置身份标识
[root@server1 ~]# git config --global user.name "xiaotanggao"
[root@server1 ~]# git config --global user.email "xiaotanggao@qq.com"
[root@server1 ~]# git config --list
user.name=xiaotanggao
user.email=xiaotanggao@qq.com
创建一个新的存储库(上传本地代码)
[root@server1 ~]# mkdir mygit
[root@server1 ~]# cd mygit/
[root@server1 mygit]# git clone git@192.168.139.20:root/my_project.git
[root@server1 mygit]# cd my_project/
[root@server1 my_project]# touch README.md
[root@server1 my_project]# git add README.md
[root@server1 my_project]# git commit -m "add README"
[master(根提交) dafe32a] add README
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
[root@server1 my_project]# git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 212 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.139.20:root/my_project.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。