git 提供代码管理
jenkins 实现持续集成,持续发布
docker&&k8s 发布
查看整篇文章请查看https://note.youdao.com/s/NuoA5Yus
Git、Github、Gitlab的区别
Git是一个开源的分布式版本控制系统、用于敏捷高效的处理任何大或小的项目是林纳斯为了帮助linux内核开发而开发的一个版本控制器
Github是在先基于Git的代码托管服务。Github提供付费账户和免费账户,这两种账户都可以创建公开的代码库,但是只有付费账户才可以创建私有代码仓库,GitLat解决了这个问题
部署Git服务
准备两台虚拟机 192.168.200.30 master 192.168.200.40 slave
初始化--两台
systemctl stop firewalld;systemctl disable firewalld;setenforce 0;iptables -F;iptables -X;iptables -Z;
下载git--两台
[root@git-master \~]# yum install -y git git-core gitweb
git-master
[root@git-master \~]# useradd git ##创建git用户
[root@git-master \~]# passwd git ##创建git密码
Changing password for user git.New password:BAD PASSWORD: The password is a palindromeRetype new password:passwd: all authentication tokens updated successfully.
[root@git-master \~]# mkdir /git-root/ ##创建git目录 --可以不创建
[root@git-master \~]# cd /git-root/
[root@git-master git-root]# ls
[root@git-master git-root]# git init --bare tanc.git ##创建git库git ini和git init -bare的区别在于一个是非裸库应该是非裸库裸库和非裸库区别是,非裸库可以当作git服务器使用,裸库不能进行git操作
[root@git-master git-root]# lstanc.git
[root@git-master git-root]# cd tanc.git/
[root@git-master tanc.git]# lsbranches config description HEAD hooks info objects refs
[root@git-master tanc.git]# cd ..
[root@git-master git-root]# chown -R git:git tanc.git/ ##修改权限
git-slave
[root@git-slave \~]# ssh-keygen[root@git-slave \~]# ssh-copy-id git@192.168.200.30
[root@git-slave \~]# git config --global user.email "tanc@qq.com" ##设置你的邮箱
[root@git-slave \~]# git config --global user.name "tanc" ##设置你的名字
[root@git-slave \~]# git clone git@192.168.200.30:/git-root/tanc.gitCloning into 'tanc'...warning: You appear to have cloned an empty repository.
[root@git-slave \~]# lstancdone[root@git-slave tanc]# cd tanc/
[root@git-slave tanc]# vim test.sh
[root@git-slave tanc]# cat test.sh
for i in 1 2 3 4
do
echo \$i
done
[root@git-slave tanc]# git add test.sh ##将代码文件放到暂存区
[root@git-slave tanc]# git commit -m 'tanc test' ##提交暂存区的代码
[master (root-commit) 67a5058] tanc test1 file changed, 4 insertions(+)create mode 100644 test.sh\\-m 描述
[root@git-slave tanc]# git push origin master ##上传到仓库
Counting objects: 3, done.Writing objects: 100% (3/3), 229 bytes | 0 bytes/s, done.Total 3 (delta 0), reused 0 (delta 0)To git@192.168.200.30:/git-root/tanc.git\* [new branch] master -> master将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。##把之前克隆的库删除在克隆
[root@git-slave \~]# git clone git@192.168.200.30:/git-root/tanc.git
Cloning into 'tanc'...remote: Counting objects: 3, done.remote: Total 3 (delta 0), reused 0 (delta 0)Receiving objects: 100% (3/3), done.
[root@git-slave \~]# ls
[root@git-slave \~]# cd tanc/
[root@git-slave tanc]# lstest.sh
git工作流程
- 一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git基本概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
**- 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。 **
**- 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。 **
**- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。 **
**- 当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。 **
**- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。 **
**- 当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。 **
**- 当执行 "git rm --cached " 命令时,会直接从暂存区删除文件,工作区则不做出改变。 **
**- 当执行 "git checkout ." 或者 "git checkout -- " 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。 **
- 当执行 "git checkout HEAD ." 或者 "git checkout HEAD " 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
Git客户端配置和使用
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 `git config` 时用--system`选项,读写的就是这个文件。
** ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 `git config` 时用 --global
选项,读写的就是这个文件。**
当前项目的 Git 目录中的配置文件(也就是工作目录中的** .git/config`文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。**
git用户信息
git config --global user.name "xxx"
git config --global user.email xxxx
文本编辑器
git config --global core.editor vim
差异分析工具
git config --global merge.tool diff
查看已有的配置信息
git config --list
##如果又重复的变量名说明它们来自不同的配置文件
查看特点的变量
git config 变量
git使用
ssh 链接
客户机上产生公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全
本地项目与远程服务器项目之间的交互、
假如你没有最新的代码,希望从头开始
[root@qfedu.com \~]# git clone git@XXX.git # 这里是项目的地址(可从项目主页复制),将远程服务器的内容完全复制过来
[root@qfedu.com \~]# cd BGBInspector\_V01 # clone 之后进入该项目的文件夹
[root@qfedu.com \~]# touch README.md # 新建readme文件
[root@qfedu.com \~]# git add README.md # 将新的文件添加到git的暂存区
[root@qfedu.com \~]# git commit -m ‘Its note:add a readme file’ # 将暂存区的文件提交到某一个版本保存下来,并加上注释
[root@qfedu.com \~]# git push -u origin master # 将本地的更改提交到远程服务器
如果你有一个新版代码、希望直接把他本地的代码替换到远程服务器
[root@qfedu.com \~]# cd existing\_folder #进入代码存在的文件夹,或者直接在该文件夹打开
[root@qfedu.com \~]# git init # 初始化
[root@qfedu.com \~]# git remote add origin git@master:/git-test/shell.git #添加远程项目"shell"库的地址(可从项目主页复制) ,前提是事先需要先在git远程服务器上创建相应的裸库"shell"
[root@qfedu.com \~]# git add . #添加该文件夹中所有的文件到git的暂存区
[root@qfedu.com \~]# git commit -m ‘note’ #提交所有代码到本机的版本库
[root@qfedu.com \~]# git push -u origin master #将本地的更改提交到远程服务器
git 中 clone过来的时候,git 不会对比本地和服务器的文件,也就不会有冲突,
建议确定完全覆盖本地的时候用 clone,不确定会不会有冲突的时候用 git pull,将远程服务器的代码download下来
git pull=git fetch+git merge
实验
##远程仓库
[root@slave tanc]# cat test1.sh
#!/bin/bash
echo "1234"
##本地代码
[root@slave tanc]# cat test1.sh
#!/bin/bash
echo "56789"
##使用add和commit
[root@slave tanc]# git add test1.sh
[root@slave tanc]# git command -m "test2"
git: 'command' is not a git command. See 'git --help'.
[root@slave tanc]# git commit -m "test2"
[master 1c14e0c] test2
1 file changed, 1 insertion(+), 1 deletion(-)
##使用fetch下载远程代码
[root@slave tanc]# git fetch origin master:test
From 192.168.200.30:/git-root/tanc
\* [new branch] master -> test
##查看本地代码有没有变化
[root@slave tanc]# ls
test1.sh
[root@slave tanc]# cat test1.sh
#!/bin/bash
echo "56789"
##fetch是把远程代码作为本地的一个其他分支下载到本地,并不更新本地分支,这里的命令是
##把远程的"master"分支下载到本地作为一个新的分支”test“存在
##查看本地文件
##发现没有变化,用git diff 来对比两分支啥区别
[root@slave tanc]# git diff master test
diff --git a/test1.sh b/test1.sh
index 8bba5df..d47faec 100644
--- a/test1.sh
+++ b/test1.sh
@@ -1,2 +1,2 @@
#!/bin/bash
-echo "56789"
+echo "1234"
###如果fetch下来的代码没什么问题,可以选择和本地进行合并
[root@slave tanc]# git merge master
Already up-to-date.
常用git命
git init ##初始化
git add [xxxx] ##将某一个文件加入到暂存区
git add . ##将文件夹下的所有文件加入到暂存区
git commit -m 'xxx' ##将暂存区中的文件保存成为某一个版本
git log #查看所有的版本日志
git status # 查看现在暂存区的状况
git diff # 查看现在文件与上一个提交-commit版本的区别
git reset --hard HEAD^ # 回到上一个版本
git reset --hard XXXXX # XXX为版本编号,回到某一个版本
git pull origin master # 从主分支pull到本地
git push -u origin master # 从本地push到主分支
git pull # pull默认主分支
git push # push默认主分支 ...
git reflog #查看历史命令
版本回退
##查看本地文件
[root@slave tanc]# cat test1.sh
#!/bin/bash
echo "1234"
##使用git log查看commit版本id
##然后在使用git reset回退
[root@slave tanc]# git log
commit 1c14e0cb37bc83daeec124ac25c05776fed656c3
Author: tanc <tanc@qq.com>
Date: Wed Sep 22 21:26:56 2021 -0400
test2
commit 68deba800df4290e0a8c8f6b4ecffaba47400136
Author: tanc <tanc@qq.com>
Date: Wed Sep 22 21:02:52 2021 -0400
test1
##我们现在版本是test1我们退到test2
[root@slave tanc]# git reset --hard 1c14e0cb37bc83daeec124ac25c05776fed656c3
HEAD is now at 1c14e0c test2
[root@slave tanc]# cat test1.sh
#!/bin/bash
echo "56789"
##还可以退到test1
[root@slave tanc]# git reset --hard 68deba800df4290e0a8c8f6b4ecffaba47400136
HEAD is now at 68deba8 test1
[root@slave tanc]# cat test1.sh
#!/bin/bash
echo "1234"
分支管理
[root@slave tanc]# git checkout test ##切换到test分支 如果是有个-b
##就是创建和切换相当于 git branch dev git checkout test
[root@slave tanc]# git branch ##列出所所有分支前面有*号的表示在当前分区
master
\* test
##在test分支提交文件
[root@slave tanc]# touch txt.txt
[root@slave tanc]# git add txt.txt
[root@slave tanc]# git commit -m 'test txt'
[test 1517cc8] test txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 txt.txt
##切换master分支
[root@slave tanc]# ls
test1.sh txt.txt
[root@slave tanc]# git checkout master
Switched to branch 'master'
[root@slave tanc]# ls
test1.sh
[root@sla
##会发现txt.txt文件不见了,应为是在test分支提交的而不是在master分支
#合并分支
[root@slave tanc]# git merge test ##把test分支合并到master分支
Updating 68deba8..1517cc8
Fast-forward
txt.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 txt.txt
[root@slave tanc]# ls
test1.sh txt.txt
###注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
###当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并
#删除test分支
[root@slave tanc]# git branch -d test
##查看所有分支
[root@slave tanc]# git branch
\* master
解决冲突
[root@slave tanc]# git checkout -b test2 ##创建test2分支并切换到它
Switched to a new branch 'test2'
##在test2创建readn.txt文件并上传
[root@slave tanc]# vim readne.txt
[root@slave tanc]# cat readne.txt
this is test2
[root@slave tanc]# git add readne.txt
[root@slave tanc]# git commit -m 'test2-readn'
[test2 d8dcea2] test2-readn
1 file changed, 1 insertion(+)
create mode 100644 readne.txt
##切换到master
[root@slave tanc]# git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits) ##git提醒你的mater的分支要比远程的master分支要超前提1个提交
##在master也创建readne.txt文件
[root@slave tanc]# cat readne.txt
this is master
##提交
[root@slave tanc]# git add readne.txt
[root@slave tanc]# git commit -m "master-readn"
[master 477138b] master-readn
1 file changed, 1 insertion(+)
create mode 100644 readne.txt
##合并
[root@slave tanc]# git merge test2
Auto-merging readne.txt
CONFLICT (add/add): Merge conflict in readne.txt
Automatic merge failed; fix conflicts and then commit the result.
##现在,master分支和feature1分支各自都分别有新的提交
##这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就会有冲突
##查看冲突的文件
[root@slave tanc]# git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
# (use "git push" to publish your local commits)
# You have unmerged paths.
# (fix conflicts and run "git commit")
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
# both added: readne.txt
no changes added to commit (use "git add" and/or "git commit -a")
##在直接查看readne.txt文件
[root@slave tanc]# cat readne.txt
<<<<<<< HEAD
this is master
=======
this is test2
>>>>>>> test2
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
##Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存再提交:
[root@slave tanc]# git add readne.txt
[root@slave tanc]# git commit -m 'master-readn.txt'
[master 0d55c0e] master-readn.txt
##删除test2
[root@slave tanc]# git branch -d test2
Deleted branch test2 (was d8dcea2).