Git 使用笔记
基础操作:初始化、暂存、提交、忽略、撤销、回退。
1. 安装与初始化
yum install -y git # 安装 git
mkdir demo && cd demo # 创建项目目录
git init # 初始化本地版本库,生成 .git 目录
2. 查看状态
git status # 查看详细状态
git status -s # 简化输出
状态简写含义:
| 标记 | 含义 |
|---|---|
?? |
未跟踪文件 |
A |
已暂存的新增文件 |
M |
已暂存的修改 |
M |
工作区已修改,未暂存 |
MM |
暂存后又修改,暂存区和工作区都有变化 |
D |
已暂存的删除 |
D |
工作区删除,未暂存 |
3. 基本提交流程
echo test > README.md # 创建文件
git status -s # 输出 ?? README.md
git add README.md # 添加到暂存区
git status -s # 输出 A README.md
首次提交前需配置用户信息(全局)
git config --global user.email "yakexi007@westos.org"
git config --global user.name "wxh"
git commit -m "add README.md" # 提交到本地仓库
修改文件后再次提交:
echo hello >> README.md
git status -s # 输出 " M README.md"(工作区修改)
git add README.md
git status -s # 输出 "M README.md"(已暂存)
echo world >> README.md
git status -s # 输出 "MM README.md"(暂存后又修改)
git commit -m "v1" # 只提交已暂存的内容
git status -s # 输出 " M README.md"(剩余修改未暂存)
git add . # 添加所有修改
git commit -m "v2"
4. 忽略文件
touch .a # 创建隐藏文件
git status -s # 输出 ?? .a
vim .gitignore # 创建忽略规则文件
.* # 忽略所有以 . 开头的文件
git status -s # 不再显示 .a
5. 撤销与取消暂存
echo helloworld > test.txt
git add test.txt
git commit -m "add test.txt"
删除工作区文件
rm -f test.txt
git status -s # 输出 " D test.txt"(工作区删除)
git checkout -- test.txt # 从暂存区恢复文件到工作区
取消暂存区文件(保留工作区)
git rm test.txt # 删除文件并放入暂存区
git status -s # 输出 "D test.txt"
git reset HEAD test.txt # 取消暂存,文件回到工作区
6. 版本回退
git rm test.txt
git commit -m "delete test.txt" # 提交删除操作
git reflog # 查看所有操作记录(含提交哈希)
输出示例:58b1bc2 HEAD@{0}: commit: delete test.txt
git reset --hard 6db53fe # 回退到指定提交,工作区和暂存区都重置
--hard 会丢弃当前工作区和暂存区的修改,慎用。
github远程代码仓库
登录:GitHub · Change is constant. GitHub keeps you ahead. · GitHub · GitHub
注册登录
创建仓库

上传公钥
root@server1 demo# ssh-keygen



Git 推送与克隆仓库
将本地仓库推送到远程(GitHub),以及从远程克隆仓库到本地。使用 SSH 协议需提前配置好 SSH 公钥。
1. 重命名分支为 main
GitHub 默认分支为 main,本地初始化后通常是 master,可重命名保持一致。
cd demo/
git branch -M main # -M 强制重命名当前分支为 main
2. 添加远程仓库
git remote add origin git@github.com:westos007(自己的github名字)/demo.git
# origin 是远程仓库的别名,可自定义
# git@github.com:... 表示使用 SSH 协议
查看已添加的远程仓库:
git remote -v
输出示例:
origin git@github.com:westos007/demo.git (fetch)
origin git@github.com:westos007/demo.git (push)
3. 推送本地分支到远程
git push -u origin main
-
-u:设置上游分支,之后直接git push即可推送到origin/main。 -
首次连接 GitHub 会提示确认主机指纹,输入
yes继续。
输出示例:
The authenticity of host 'github.com (20.205.243.166)' can't be established.
...
Are you sure you want to continue connecting (yes/no)? yes
...
To git@github.com:westos007/demo.git
* [new branch] main -> main
Branch main set up to track remote branch main from origin.
4. 克隆远程仓库
rm -fr demo/ # 删除本地旧目录,模拟全新克隆
git clone git@github.com:westos007/demo.git
输出示例:
Cloning into 'demo'...
remote: Enumerating objects: 12, done.
...
Receiving objects: 100% (12/12), done.
查看克隆结果:
cd demo/
ls
# 输出:README.md test.txt
部署gitlab
提前下好rpm包
EXTERNAL_URL="https://gitlab.example.com" dnf install gitlab-ce-18.11.12-ce.0.el9.x86_64.rpm
gitlab-ctl reconfigure
登录
用户:root
初始密码: cat /etc/gitlab/initial_root_password
语言设置


修改密码,初始密码24小时后过期

新建项目

添加密钥

克隆项目
root@server1 ~]# git clone git@192.168.56.11:root/demo.git
Cloning into 'demo'...
The authenticity of host '192.168.56.11 (192.168.56.11)' can't be established.
ECDSA key fingerprint is SHA256:wENyii9Q7PhKduD9pHQD5G3EbAt68JiY51ifHt4lD7Y.
ECDSA key fingerprint is MD5:65:e0:39:b7:a3:97:d2:19:81:6e:70:f2:a4:e0:12:d8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.56.11' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
[root@server1 ~]# ls
demo
[root@server1 ~]# cd demo/
[root@server1 demo]# git remote -v
origin git@192.168.56.11:root/demo.git (fetch)
origin git@192.168.56.11:root/demo.git (push)
推送本地修改到远程
在本地完成修改后,通过以下流程将改动推送到远程仓库:
echo www.westos.org > index.html # 创建或修改文件
git add index.html # 添加到暂存区
git commit -m "add index.html" # 提交到本地仓库
git push -u origin main # 推送到远程 main 分支
输出示例:
Counting objects: 4, done.
Writing objects: 100% (3/3), 286 bytes | 0 bytes/s, done.
To git@192.168.56.11:root/demo.git
30504ed..e72f22d main -> main
Branch main set up to track remote branch main from origin.
部署jenkins
yum install fontconfig java-21-openjdk
rpm -ivh jenkins-2.395-1.1.noarch.rpm
启动服务
[root@server5 ~]# systemctl enable --now jenkins.service
[root@server5 ~]# netstat -antlp|grep :8080
tcp6 0 0 :::8080 :::* LISTEN 9579/java
登录
http://192.168.150.195:8080/
初始密码
root@server5 jenkins# cat /var/lib/jenkins/secrets/initialAdminPassword

直接使用admin登录,进入后修改密码

安装推荐插件

替换国内插件源
cd /var/lib/jenkins
全局替换下载地址,把国外地址换成清华镜像
sed -i 's|https://updates.jenkins.io/download\|https://mirrors.tuna.tsinghua.edu.cn/jenkins\|g' updates/default.json
重启jenkins生效
systemctl restart jenkins
配置
修改密码

新建项目

在jenkins主机上安装git工具
root@server5 \~# yum install -y git
创建密钥并上传gitlab
root@server5 \~# ssh-keygen
添加gitlab认证凭据








配置ssh
[root@server5 ~]# vim /etc/ssh/ssh_config
Host *
StrictHostKeyChecking no


构建触发器

构建任务

查看控制台输出

实时触发
安装gitlab插件

配置项目触发器


配置gitlab



再回到demo项目下配置

1. GitLab
把生成的字符串粘贴到 Secret 令牌 框里。
2. Jenkins
进入你的 Jenkins 项目 → 配置 → 构建触发器 → 勾选 "Build when a change is pushed to GitLab" → 下面有个 Secret token ,粘贴同一个字符串。

测试推送

自动化构建docker镜像
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[root@server6 ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@server7 ~]# echo "192.168.150.186 reg.westos.org" >> /etc/hosts
[root@docker1 docker]# scp -r certs.d/ 192.168.150.196:/etc/docker/
[root@server7 ~]# cp /etc/docker/certs.d/reg.westos.org/ca.crt /etc/pki/ca-trust/source/anchors/reg.westos.org.crt
update-ca-trust extract
测试
root@server6 docker# docker pull nginx

登录私有harbor仓库
root@server6 test# docker login reg.westos.org
安装CloudBees Docker Build and Publish插件

配置项目构建


在server4上提交Dockerfile
[root@server4 demo]# vim Dockerfile
FROM reg.westos.org/library/nginx:latest
COPY index.html /usr/share/nginx/html
[root@server4 demo]# git status -s
?? Dockerfile
[root@server4 demo]# git add Dockerfile
[root@server4 demo]# git commit -m "add Dockerfile"
[main 8034141] add Dockerfile
1 file changed, 2 insertions(+)
create mode 100644 Dockerfile
[root@server4 demo]# git push -u origin main
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 350 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.56.11:root/demo.git
85c9da3..8034141 main -> main
Branch main set up to track remote branch main from origin.
此时gitlab会主动触发jenkins构建任务,观察jenkins的任务输出
1.报错:
permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
Jenkins 跑在 jenkins用户身份下,而 /var/run/docker.sock只有 root和 docker组能访问。
修复:把 jenkins 用户加入 docker 组
1. 看 docker.sock 的权限ls -l /var/run/docker.sock# 应该输出类似:srw-rw----. 1 root docker ... /var/run/docker.sock#
2. 把 jenkins 加进 docker 组usermod -aG docker jenkins
3. 确认加进去了id jenkins# 应该看到 groups 里有 docker# 4. 重启 Jenkins(让新组生效)systemctl restart jenkins
2.报错
push access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials Build step 'Docker Build and Publish' marked build as failure Finished: FAILURE
切换成 jenkins 用户登录 sudo -u jenkins docker login reg.westos.org

添加jenkins节点
新建虚拟机server6
安装jdk和git
在节点管理中添加节点



server6 ssh认证

关闭master节点的构建任务数

关闭git主机校验

主机信任证书
[root@server0 ~]# cp /etc/docker/certs.d/reg.westos.org/ca.crt /etc/pki/ca-trust/source/anchors/reg.westos.org.crt
[root@server0 ~]# update-ca-trust extract
systemctl restart docker
再次构建会在远程节点
最后测试构建,构建任务会在新节点上运行
通过ssh插件交付任务
新建测试虚拟机server7
在server7上安装docker-ce
[root@server6 ~]# cd /etc/yum.repos.d/
[root@server6 yum.repos.d]# scp docker-ce.repo 192.168.150.197:/etc/yum.repos.d/
[root@server7 yum.repos.d]# yum install -y docker-ce
[root@server7 ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@server7 ~]# echo "192.168.150.186 reg.westos.org" >> /etc/hosts
[root@docker1 docker]# scp -r certs.d/ 192.168.150.197:/etc/docker/
[root@server7 ~]# cp /etc/docker/certs.d/reg.westos.org/ca.crt /etc/pki/ca-trust/source/anchors/reg.westos.org.crt
update-ca-trust extract
jenkins安装ssh插件

进入系统配置,添加ssh主机

新建docker_test项目

当test项目成功运行后触发docker_test项目



RBAC
安装插件

修改默认授权策略

新建测试用户



用户授权


再次登录发现看不到项目

增加项目角色


再次登录zyl用户可以看到项目

pipeline
安装ssh agent 插件

新建流水线项目 docker_image_build


复制脚本
pipeline {
agent any
stages {
stage('check out') {
steps {
git credentialsId: '4c0ab29d-68d2-4f17-a02c-6dd3ec822ab4', url: 'git@192.168.150.194:root/demo.git', branch: 'main'
}
}
stage('docker build') {
steps {
sh '''
cd $WORKSPACE
docker build -t reg.westos.org/library/demo:${BUILD_NUMBER} .
'''
}
}
stage('docker push') {
steps {
sh '''
REPOSITORY=reg.westos.org/library/demo:${BUILD_NUMBER}
docker tag $REPOSITORY reg.westos.org/library/demo:latest
docker login reg.westos.org -u admin -p 123456
docker push $REPOSITORY
docker push reg.westos.org/library/demo:latest
'''
}
}
stage('docker deploy') {
steps {
sshagent(credentials: ['4cacba5c-5e72-4ced-a41d-84b089fde458']) {
sh '''
ssh -o StrictHostKeyChecking=no root@192.168.150.197 """
docker ps -a |grep myapp && docker rm -f myapp;docker rmi reg.westos.org/library/demo:latest
docker run -d --name myapp -p 80:80 reg.westos.org/library/demo:latest """
'''
}
}
}
}
}
第一个credentialsId

ssh需要使用ssh免密认证
在build节点将私钥复制过去新节点
[root@server6 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:qFgwEx59h3lJK0OC5Z9VxAHiwja2pbhTWngr7PbuW+U root@server6
The key's randomart image is:
+---[RSA 3072]----+
| o+o o+o=+. |
| ..=.++.+o. |
| = B.=oo |
| O B * |
| o B + S |
| . O o o |
| B o . E |
| ..o . |
| ..+=. |
+----[SHA256]-----+
[root@server6 ~]# ssh-copy-id 192.168.150.197
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.150.197's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.150.197'"
and check to make sure that only the key(s) you wanted were added.
[root@server6 ~]# cd .ssh/
[root@server6 .ssh]# cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----

第二个cert

自动生成流水线脚本

