Git入门

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

自动生成流水线脚本

相关推荐
daliucheng17 分钟前
lazygit 上手:日常 git 操作一篇讲完
git
codigger2 小时前
大厂git提交规范
git·程序员
挖掘狂人2 小时前
六条分支,一条主干:我的 Git 分支管理心得
git·后端·程序员
Brookty3 小时前
Git与GitHub系统学习|本地Git工作模型:终端与进程、CWD、HEAD/Index/工作树及Git对象
git·github
我是koten10 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
RuoyiOffice16 小时前
KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力
spring boot·kubernetes·kubesphere·jenkins·paas·微服务部署·ruoyi office
风吹稻子17 小时前
etcd备份与恢复:删了 etcd.yaml,容器为什么还在跑?——一次 K8s 控制面死锁排查实录
kubernetes
2301_7671139818 小时前
点过“不再询问”就要检查:Claude Code权限文件也可能存着密钥
git·信息安全·claude code
weirong21 小时前
Operator 的测试该写到哪一层?139 个用例之后我划的三条线
kubernetes