Git版本控制

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安装

[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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值