Git简介
Git是分布式版本控制系统(Version Control System,VCS)的一种实现,由Linux之父Linus Torvalds于2005年创建
◼ 数据仓库 (Repository) 是记录文件或目录状态的地方,存储着内容修改的历史记录
◆ 远程数据库: 配有专用的服务器,为了多人共享而建立的数据库
◆ 本地数据库: 为了方便用户个人使用,在自己的机器上配置的数据库
◼ git有很多命令用于基于本地和远程仓库的代码管理
Git基础概念
Git将管控的源代码置于一个目录中,目录名即为项目名称,因而该目录即为项目的“根(起始位置)”
Git在其项目目录中会为版本控制机制划分出工作区、暂存区和版本库三个空间
◼ 工作区(working directory)
◆项目目录内部的空间即为工作区
◆项目目录内部还会存在一个隐藏的子目录“.git”,这个子目录就是暂存区和版本库的存放位置
◼ 暂存区(staging area)
◆暂存区git开始跟踪和保存文件中发生的更改的地方
◆用户在工作区做出一些更改后,可以运行命令(git add)把这些更改先复制到暂存区中暂存
◆暂存区只会记录用户执行暂存命令之前的更改,后来再做的变更需要再次运行暂存命令完成暂存
◼ 版本库(repository)
◆暂存区中的更改累积到一定程度后,即可使用命令(git commit)将这些更改一并提交至版本库中持久保存
◆提交(commit)只是一个检查点,用于告诉git将暂存区的内容同前一次的提交进行比较,并记录下来生成的所有更改
◆提交操作完成后,会自动清空暂存区
Git本地版本控制的基本工作流程
◼ 开始使用git时,需要先于项目目录中运行“git init”命令,生成.git目录结构,完成版本库初始化
◼ 暂存和提交两个步骤是周期类操作,可根据城要重复运行
◆随着用户在工作区编码工作的展开,可随时按需运行“git add”命令将工作区中的更改暂存,该区域通常也称为索引
◆ 暂存区累积的更改操作,可由用户使用“git commit”命令一次性地提交到版本库中
⚫ 每次提交操作完成后会生成一个反映到提交操作这一该工作区的状态快照,并可拥有名称和标识,即commit name和commit id
◼ 每个commit,都可由用户使用“git checkout”命令按需检出
◆checkout命令执行了同commit命令相反的操作,它将版本中存储的commit所代表着的工作区状态反映到工作区中
◆checkout命令完成后,工作区中的内容与其检出的提交那一刻的状态相同
⚫ 若工作中存储此前未被提交的新文件,这些文件不计入在此刻的状态表示中
⚫ 当然,用户也可以暂存这些新文件,并将带有新文件的工作区提交到版本库中,这将是新的暂存和提交循环
git安装
◼ 下载页面 https://git-scm.com/download/linux
◼ 主流Linux发行版在其程序仓库均提供了可用的程序包
[root@ubuntu2004 deploy-demoapp]#git --version
git version 2.25.1
[root@ubuntu2004 deploy-demoapp]#git --help
用法:git [--version] [--help] [-C <路径>] [-c <名称>=<取值>]
[--exec-path[=<路径>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<路径>] [--work-tree=<路径>] [--namespace=<名称>]
<命令> [<参数>]
这些是各种场合常见的 Git 命令:
开始一个工作区(参见:git help tutorial)
clone 克隆仓库到一个新目录
init 创建一个空的 Git 仓库或重新初始化一个已存在的仓库
在当前变更上工作(参见:git help everyday)
add 添加文件内容至索引
mv 移动或重命名一个文件、目录或符号链接
restore 恢复工作区文件
rm 从工作区和索引中删除文件
sparse-checkout 初始化及修改稀疏检出
检查历史和状态(参见:git help revisions)
bisect 通过二分查找定位引入 bug 的提交
diff 显示提交之间、提交和工作区之间等的差异
grep 输出和模式匹配的行
log 显示提交日志
show 显示各种类型的对象
status 显示工作区状态
扩展、标记和调校您的历史记录
branch 列出、创建或删除分支
commit 记录变更到仓库
merge 合并两个或更多开发历史
rebase 在另一个分支上重新应用提交
reset 重置当前 HEAD 到指定状态
switch 切换分支
tag 创建、列出、删除或校验一个 GPG 签名的标签对象
协同(参见:git help workflows)
fetch 从另外一个仓库下载对象和引用
pull 获取并整合另外的仓库或一个本地分支
push 更新远程引用和相关的对象
命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些概念帮助。
查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的
帮助。
有关系统的概述,查看 'git help git'。
git初始化仓库
[root@ubuntu2004 deploy-demoapp]#git init
已初始化空的 Git 仓库于 /data/deploy-demoapp/.git/
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
尚无提交
无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)
[root@ubuntu2004 deploy-demoapp]#ls -a
. .. .git
配置git
◼ 命令:git config
◼ git配置有三个级别,分别对应三个文件
◆--system:系统级,全系统范围有效,对应文件/etc/gitconfig
◆--global:全局级,当前用户范围有效,对应文件为$HOME/.gitconfig
◆--local:本地级,仅对当前一个项目有效,对应文件为项目目录下的.git/config
◼ 配置文件使用ini格式,存在一至多个[section],各配置参数可以section为前缀引用
◼ 列出已有配置:git config -l | --list
常用的配置变量
◼ user.name
◆用户名
◆另外还可以使用author.name标记作者,以及使用committer.name标记提交者
◼ user.email
◆用户的邮箱
◆另外还可以使用author.email标记作者邮箱,以及使用committer.email标记提交者邮箱
◼ color.ui
◆为color.diff和color.grep设定默认值
◆true或auto表示启用语法着色功能
◆false或never表示关闭语法着色功能
◼ core.editor
◆配置git默认使用的文本编辑器
◆也可由环境变量GIT_EDITOR指定,且优先级更高
[root@ubuntu2004 deploy-demoapp]#git config --global user.name ShuHong
[root@ubuntu2004 deploy-demoapp]#git config --global user.email 985347841@qq.com
[root@ubuntu2004 deploy-demoapp]#git config --global color.ui auto
[root@ubuntu2004 deploy-demoapp]#git config --global core.editor vim
[root@ubuntu2004 deploy-demoapp]#git config -l
user.name=ShuHong
user.email=985347841@qq.com
color.ui=auto
core.editor=vim
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
git命令应用
本地工作目录提交至暂存区
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
README.md
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: README.md
暂存区提交到版本库
[root@ubuntu2004 deploy-demoapp]#git commit -m "Initial Commit"
[master (根提交) 2323892] Initial Commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
无文件要提交,干净的工作区
[root@ubuntu2004 deploy-demoapp]#tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── fsmonitor-watchman.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── pre-merge-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ ├── pre-receive.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 13
│ │ └── 55da670041bbb3dd7643f002f10df9dd34efe4
│ ├── 23
│ │ └── 23892fa734d3f2f61593d3b9f94f652482e90d
│ ├── e4
│ │ └── 054737d03906e84f86a8690a82d19c9117171c
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
15 directories, 24 files
查看提交日志
[root@ubuntu2004 deploy-demoapp]#git log
commit 2323892fa734d3f2f61593d3b9f94f652482e90d (HEAD -> master)
Author: ShuHong <985347841@qq.com>
Date: Tue Nov 29 11:51:58 2022 +0800
Initial Commit
#每行一个commit
[root@ubuntu2004 deploy-demoapp]#git log --oneline
2323892 (HEAD -> master) Initial Commit
#显示提交中文件的statistics
[root@ubuntu2004 deploy-demoapp]#git log --stat
commit 2323892fa734d3f2f61593d3b9f94f652482e90d (HEAD -> master)
Author: ShuHong <985347841@qq.com>
Date: Tue Nov 29 11:51:58 2022 +0800
Initial Commit
README.md | 1 +
1 file changed, 1 insertion(+)
#显示提交的详细信息
[root@ubuntu2004 deploy-demoapp]#git log -p
commit 2323892fa734d3f2f61593d3b9f94f652482e90d (HEAD -> master)
Author: ShuHong <985347841@qq.com>
Date: Tue Nov 29 11:51:58 2022 +0800
Initial Commit
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1355da6
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+deploy-demoapp
项目中文件的状态
在git版本库,一个被跟踪的文件可能处于下面三种状态之一
◼ unstaged (in Working Tree) – called unstaged changes
◼ staged (in Staging Area or Index or Cache) – called staged changes
◼ committed (in local repo object database)
处于工作区或暂存区中的文件,在使用git status命令查看时,可能会显示为多种状态
◼ unmodified
◼ added
◼ modified
◼ deleted
◼ renamed
◼ copied
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: README.md
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
deploy-demoapp.yaml
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
修改: README.md
新文件: deploy-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-2"
[master 8864b01] commit-2
2 files changed, 7 insertions(+), 1 deletion(-)
create mode 100644 deploy-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git log --oneline
8864b01 (HEAD -> master) commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git log -p
commit 8864b0118c12fe7864634cba99032b1e83dd01e6 (HEAD -> master)
Author: ShuHong <985347841@qq.com>
Date: Tue Nov 29 12:05:37 2022 +0800
commit-2
diff --git a/README.md b/README.md
index 1355da6..509bdfd 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-deploy-demoapp
+deploy-demoapp V1
diff --git a/deploy-demoapp.yaml b/deploy-demoapp.yaml
new file mode 100644
index 0000000..513bbbb
--- /dev/null
+++ b/deploy-demoapp.yaml
@@ -0,0 +1,6 @@
+apiVersion: apps/v1
+kind: deployment
+metadata:
+ name: demoapp
+ namespace: default
+spec:
commit 2323892fa734d3f2f61593d3b9f94f652482e90d
Author: ShuHong <985347841@qq.com>
Date: Tue Nov 29 11:51:58 2022 +0800
Initial Commit
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1355da6
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+deploy-demoapp
#仅用于被跟踪的文件,为被跟踪的不要使用,被跟踪的一定要使用git命令的rm和mv
[root@ubuntu2004 deploy-demoapp]#git mv deploy-demoapp.yaml deployment-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
重命名: deploy-demoapp.yaml -> deployment-demoapp.yaml
对比文件的变动
查看文件的变动
◼ git diff命令
◼ git diff
◆显示自前一次提交之后尚未暂存的文件变动
◆比较的是工作区和暂存区
◼ git diff –staged | –cached [<path>…]
◆显示暂存但尚未提交的文件变动
◆比较的是暂存区与前一次的提交
◼ git diff <commit-ID> [<path>…]
◆比较指定的提交与工作区
◼ git diff –cached <commit-ID> [<path>…]
◆比较暂存区与指定的提交
[root@ubuntu2004 deploy-demoapp]#vim service.yaml
apiVersion: v1
kind: service
metadata:
name: demoapp
namespace: default
spec:
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-3"
[master 637da77] commit-3
1 file changed, 6 insertions(+)
create mode 100644 service.yaml
[root@ubuntu2004 deploy-demoapp]#git log --oneline
637da77 (HEAD -> master) commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git diff 265c05f service.yaml
diff --git a/service.yaml b/service.yaml
new file mode 100644
index 0000000..4e2b5bf
--- /dev/null
+++ b/service.yaml
@@ -0,0 +1,6 @@
+apiVersion: v1
+kind: service
+metadata:
+ name: demoapp
+ namespace: default
+spec:
[root@ubuntu2004 deploy-demoapp]#git diff 637da77 service.yaml
[root@ubuntu2004 deploy-demoapp]#vim service.yaml
apiVersion: v1
kind: service
metadata:
name: demoapp
namespace: default
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: demoapp
[root@ubuntu2004 deploy-demoapp]#git diff
diff --git a/service.yaml b/service.yaml
index 4e2b5bf..b07c4ca 100644
--- a/service.yaml
+++ b/service.yaml
@@ -4,3 +4,9 @@ metadata:
name: demoapp
namespace: default
spec:
+ ports:
+ - name: http
+ port: 80
+ targetPort: 80
+ selector:
+ app: demoapp
[root@ubuntu2004 deploy-demoapp]#vim service.yaml
apiVersion: v1
kind: service
metadata:
name: demoapp
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: demoapp
[root@ubuntu2004 deploy-demoapp]#git diff
diff --git a/service.yaml b/service.yaml
index 4e2b5bf..ca9075c 100644
--- a/service.yaml
+++ b/service.yaml
@@ -2,5 +2,10 @@ apiVersion: v1
kind: service
metadata:
name: demoapp
- namespace: default
spec:
+ ports:
+ - name: http
+ port: 80
+ targetPort: 80
+ selector:
+ app: demoapp
[root@ubuntu2004 deploy-demoapp]#git diff --staged
diff --git a/service.yaml b/service.yaml
index 4e2b5bf..ca9075c 100644
--- a/service.yaml
+++ b/service.yaml
@@ -2,5 +2,10 @@ apiVersion: v1
kind: service
metadata:
name: demoapp
- namespace: default
spec:
+ ports:
+ - name: http
+ port: 80
+ targetPort: 80
+ selector:
+ app: demoapp
忽略项目中的某些文件
项目目录中,临时文件或由构建操作产生的文件,通常不应该纳入跟踪库中
◼ .gitignore文件可用于完成这种功能
◼ 每行指定一个文件名称,或glob形式的pattern
◼ 文件名模式也支持使用叹号取反,即排队指定的文件
◼ #开头的信息为注释行
◼ .gitignore文件自身应该纳入版本库
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
修改: service.yaml
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
.deployment-demoapp.yaml.swp
[root@ubuntu2004 deploy-demoapp]#vim .gitignore
*.class
*.swp
*.[oa]
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
修改: service.yaml
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
.gitignore
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
新文件: .gitignore
修改: service.yaml
提交历史和提交链
版本库上的commit历史组合起来会形成一个提交链
◼ 除了初始commit,每个commit都会都会有一个父commit
◼ 除了最新一次的commit,每个commit都会有一个子commit
◼ 这个提交链上的commit还可以使用字符串进行引用
◆通常,Git会为默认创建的提交链上的最新一次提交创建一个基于字符串的引用master
◆而该提交链也称为版本库的一个分支(Branch),master也是分支的名称标识
◆另外自动创建的还有一个HEAD引用,它代表提交链的“头”,表示的是工作区所关联到的提交链上的特定提交,通常是最新一次提交
◆基于HEAD指向的commit,还能够以相对方式引用历史中的提交,例如HEAD~表示前一个提交
◼ git show HEAD命令可以查看HEAD当前所指向的commit的信息
撤消操作
撤消文件变更
◼ 撤消已经加入暂存区中的文件变更:git restore –stage <pathspec>
◼ 撤消已跟踪但尚未加入暂存区中的文件变更:git restore <pathspec>
◼ 从某个提交中恢复文件:git restore -s <source> <pathspec>
◆例如,从前一次提交中恢复README.md文件:git restore -s HEAD~ READEME.md
撤消提交
◼ 命令:git reset
◆本质上是将HEAD和master引用移到指定的commit上
◆是否基于指定的commit连同重置暂存区和工作区则取决于使用的选项
◼ 三种不同的行为
◆–soft:仅移动HEAD和master指针的指向,不会重置暂存区或工作区
◆–mixed:仅重置暂存区,自commit之后暂存到暂存区的修改将移回工作区
◆–hard:同时重置暂存区和工作区,这意味着自commit之后所做出的的有修改都将会丢失
⚫ 危险操作,会导致数据丢失
[root@ubuntu2004 deploy-demoapp]#git status configmap-demoapp.yaml
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
新文件: configmap-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git restore --staged configmap-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git status configmap-demoapp.yaml
位于分支 master
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
configmap-demoapp.yaml
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@ubuntu2004 deploy-demoapp]#cat deployment-demoapp.yaml
apiVersion: apps/v1
kind: deployment
metadata:
name: demoapp
namespace: hello
spec:
[root@ubuntu2004 deploy-demoapp]#git restore deployment-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#cat deployment-demoapp.yaml
apiVersion: apps/v1
kind: deployment
metadata:
name: demoapp
namespace: default
spec:
[root@ubuntu2004 deploy-demoapp]#cat deployment-demoapp.yaml
apiVersion: apps/v1
kind: deployment
metadata:
name: demoapp
namespace: default
spec:
[root@ubuntu2004 deploy-demoapp]#git log --oneline
48995e0 (HEAD -> master) commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git restore -s 8864b01 deployment-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#cat deployment-demoapp.yaml
cat: deployment-demoapp.yaml: 没有那个文件或目录
[root@ubuntu2004 deploy-demoapp]#git restore -s 48995e0 deployment-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#cat deployment-demoapp.yaml
apiVersion: apps/v1
kind: deployment
metadata:
name: demoapp
namespace: default
spec:
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git reset --soft 265c05f
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
新文件: .gitignore
新文件: configmap-demoapp.yaml
新文件: service.yaml
[root@ubuntu2004 deploy-demoapp]#git log --oneline
265c05f (HEAD -> master) commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#ls
configmap-demoapp.yaml deployment-demoapp.yaml README.md service.yaml
[root@ubuntu2004 deploy-demoapp]#git reset --soft 7e20ad6
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
无文件要提交,干净的工作区
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git reset --mixed 265c05f
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
.gitignore
configmap-demoapp.yaml
service.yaml
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@ubuntu2004 deploy-demoapp]#ls
configmap-demoapp.yaml deployment-demoapp.yaml README.md service.yaml
[root@ubuntu2004 deploy-demoapp]#git reset --soft 7e20ad6
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#ls
configmap-demoapp.yaml deployment-demoapp.yaml README.md service.yaml
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git reset --hard 265c05f
HEAD 现在位于 265c05f commit-3
[root@ubuntu2004 deploy-demoapp]#git log --oneline
265c05f (HEAD -> master) commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#ls
deployment-demoapp.yaml README.md
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
无文件要提交,干净的工作区
[root@ubuntu2004 deploy-demoapp]#git reset --hard 7e20ad6
HEAD 现在位于 7e20ad6 commit-5
[root@ubuntu2004 deploy-demoapp]#ls
configmap-demoapp.yaml deployment-demoapp.yaml README.md service.yaml
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
无文件要提交,干净的工作区
使用远程仓库
推送代码至远程仓库的简明步骤
◼ 在某个Git托管服务上注册一个账号
◆GitHub
◆Gitee
◼ 在Git托管服务上创建一个仓库,例如名称为deploy-demoapp
◼ 在本地版本库上,使用git remote add <remote-name> <remote-url>命令添加关联的远程库
◆远程仓库,一般默认名称为origin
◆相关的url在远程库上可以直接获取到
从Git Server上克隆一个项目是初始化本地版本库的第二种常用方式
克隆操作使用git clone命令进行
◼ git clone <remote-url> [<working-directory-name>]
◆克隆<remote-url>仓库至当前目录中
◆远程仓库的名称,即为本地创建项目目录名称
◆若要在本地使用一个不同的项目目录名称,直接在命令后面指定即可
◼ 提示
◆远程仓库没有工作区,也不需要工作区
◆克隆至本地后会自动区分为工作区、暂存区和版本库
抓取远程仓库上的变动
◼ 命令:git fetch
◼ 它只会抓取远程仓库中的变动至本地版本库中,但不会修改工作区
拉取远程仓库上的变动
◼ 命令:git pull
◼ 它会拉取远程仓库中的变动至本地版本库中,而且会通过合并(merge)操作修改本地工作区
其它操作
◼ 重命名远程仓库:git remote rename <oldName> <newname>
◼ 删除本地仓库上配置的远程仓库:git remote remove <remoteRepoName>
[root@ubuntu2004 deploy-demoapp]#git remote add origin https://gitee.com/shuzihan/deploy-demoapp.git
[root@ubuntu2004 deploy-demoapp]#git remote -v
origin https://gitee.com/shuzihan/deploy-demoapp.git (fetch)
origin https://gitee.com/shuzihan/deploy-demoapp.git (push)
[root@ubuntu2004 deploy-demoapp]#git push -u origin "master"
Username for 'https://gitee.com': 18206857947
Password for 'https://18206857947@gitee.com':
枚举对象中: 19, 完成.
对象计数中: 100% (19/19), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (14/14), 完成.
写入对象中: 100% (19/19), 1.65 KiB | 844.00 KiB/s, 完成.
总共 19 (差异 3),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/shuzihan/deploy-demoapp.git
* [new branch] master -> master
分支 'master' 设置为跟踪来自 'origin' 的远程分支 'master'。
#新主机208
[root@ubuntu2004 data]#git clone https://gitee.com/shuzihan/deploy-demoapp.git
正克隆到 'deploy-demoapp'...
Username for 'https://gitee.com': 18206857947
Password for 'https://18206857947@gitee.com':
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 19 (delta 3), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (19/19), 1.63 KiB | 1.63 MiB/s, 完成.
[root@ubuntu2004 data]#ls deploy-demoapp/
configmap-demoapp.yaml deployment-demoapp.yaml README.md service.yaml
[root@ubuntu2004 deploy-demoapp]#git remote -v
origin https://gitee.com/shuzihan/deploy-demoapp.git (fetch)
origin https://gitee.com/shuzihan/deploy-demoapp.git (push)
[root@ubuntu2004 deploy-demoapp]#git config user.name wing
[root@ubuntu2004 deploy-demoapp]#git config user.email 2508208842@qq.com
[root@ubuntu2004 deploy-demoapp]#git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=https://gitee.com/shuzihan/deploy-demoapp.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
user.name=wing
user.email=2508208842@qq.com
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: configmap-demoapp.yaml
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master, origin/master, origin/HEAD) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-6"
[master 37d6054] commit-6
1 file changed, 4 insertions(+)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
37d6054 (HEAD -> master) commit-6
7e20ad6 (origin/master, origin/HEAD) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git push origin master
Username for 'https://gitee.com': 18206857947
Password for 'https://18206857947@gitee.com':
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (3/3), 315 字节 | 315.00 KiB/s, 完成.
总共 3 (差异 1),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/shuzihan/deploy-demoapp.git
7e20ad6..37d6054 master -> master
[root@ubuntu2004 deploy-demoapp]#git log --oneline
37d6054 (HEAD -> master, origin/master, origin/HEAD) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
#源主机207下
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master, origin/master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
#拉去但不合并
[root@ubuntu2004 deploy-demoapp]#git fetch origin master
Username for 'https://gitee.com': 18206857947
Password for 'https://18206857947@gitee.com':
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
展开对象中: 100% (3/3), 295 字节 | 295.00 KiB/s, 完成.
来自 https://gitee.com/shuzihan/deploy-demoapp
* branch master -> FETCH_HEAD
7e20ad6..37d6054 master -> origin/master
[root@ubuntu2004 deploy-demoapp]#git log --oneline
7e20ad6 (HEAD -> master) commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
#拉取并合并
[root@ubuntu2004 deploy-demoapp]#git pull origin master
Username for 'https://gitee.com': 18206857947
Password for 'https://18206857947@gitee.com':
来自 https://gitee.com/shuzihan/deploy-demoapp
* branch master -> FETCH_HEAD
更新 7e20ad6..37d6054
Fast-forward
configmap-demoapp.yaml | 4 ++++
1 file changed, 4 insertions(+)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
37d6054 (HEAD -> master, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
Tags
关于Tag
◼ 为某个commit添加一个标签,从而对其完成特殊标记,例如标记特定的版本信息
◼ 常用的版本标记格式
◆version-number.release-no.modificaton-no (e.g., v1.3.2)
◆version-number.release-no.upgrade-no_modificaton-no (e.g., v1.9.3_6)
◼ 通常,用户应该每天下班前提交代码并完成推送,以备份代码;待需要发一个版本时,基于tag对相应commit进行标记即可
◼ Git支持使用两种标签:轻量标签(lightweight)与附注标签(annotated)
◆轻量标签:仅为某个commit的引用
◆附注标签:存储在 Git 数据库中的一个完整对象,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还会包含一个message
管理标签
◼ 创建标签
◆轻量标签:git tag <tagName>
◆附注标签:git tag -a <tagName> -m <message>
◆给指定的commit打标签:git tag -a <tagName> -m <message> <commitID>
◼ 删除标签
◆git tag -d <tagName>
◼ 显示标签
◆列出:git tag -l
◆显示标签的详细信息:git show <tagName>
◼ 检出标签
◆git checkout <tagName>
◆注意:检出到标签,会导致分离头指针,且新创建的提交也将处于分离的状态
◼ 推送标签至远程仓库
◆推送特定标签:git push origin <tagName>
◆推送所有标签:git push –tags
◼ 删除远程仓库上的标签
◆git push –delete origin <tagName>
[root@ubuntu2004 deploy-demoapp]#git log --oneline
37d6054 (HEAD -> master, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git tag -l
[root@ubuntu2004 deploy-demoapp]#git tag -a v1.1 -m "v1.1 Released."
[root@ubuntu2004 deploy-demoapp]#git tag -l
v1.1
[root@ubuntu2004 deploy-demoapp]#git show v1.1
tag v1.1
Tagger: ShuHong <985347841@qq.com>
Date: Tue Nov 29 15:23:14 2022 +0800
v1.1 Released.
commit 37d605469051ed3f958e1b526ed81ead6177f4e3 (HEAD -> master, tag: v1.1, origin/master)
Author: wing <2508208842@qq.com>
Date: Tue Nov 29 15:10:01 2022 +0800
commit-6
diff --git a/configmap-demoapp.yaml b/configmap-demoapp.yaml
index fc02519..f8bb4ca 100644
--- a/configmap-demoapp.yaml
+++ b/configmap-demoapp.yaml
@@ -1,2 +1,6 @@
apiVersion: v1
kind: configmap
+metadata:
+ name: demoapp
+ namespace: default
+spec:
[root@ubuntu2004 deploy-demoapp]#git tag -a v1.0 -m "v1.0 Released." 8864b01
[root@ubuntu2004 deploy-demoapp]#git tag -l
v1.0
v1.1
[root@ubuntu2004 deploy-demoapp]#git show v1.0
tag v1.0
Tagger: ShuHong <985347841@qq.com>
Date: Tue Nov 29 15:24:13 2022 +0800
v1.0 Released.
commit 8864b0118c12fe7864634cba99032b1e83dd01e6 (tag: v1.0)
Author: ShuHong <985347841@qq.com>
Date: Tue Nov 29 12:05:37 2022 +0800
commit-2
diff --git a/README.md b/README.md
index 1355da6..509bdfd 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-deploy-demoapp
+deploy-demoapp V1
diff --git a/deploy-demoapp.yaml b/deploy-demoapp.yaml
new file mode 100644
index 0000000..513bbbb
--- /dev/null
+++ b/deploy-demoapp.yaml
@@ -0,0 +1,6 @@
+apiVersion: apps/v1
+kind: deployment
+metadata:
+ name: demoapp
+ namespace: default
+spec:
[root@ubuntu2004 deploy-demoapp]#git tag -d v1.0
已删除标签 'v1.0'(曾为 5815b86)
[root@ubuntu2004 deploy-demoapp]#git tag -l
v1.1
[root@ubuntu2004 deploy-demoapp]#git push origin tag --all
fatal: 标签后面未提供 <标签> 参数
[root@ubuntu2004 deploy-demoapp]#git push origin tag v1.1
Username for 'https://gitee.com': 18206857947
Password for 'https://18206857947@gitee.com':
枚举对象中: 1, 完成.
对象计数中: 100% (1/1), 完成.
写入对象中: 100% (1/1), 162 字节 | 162.00 KiB/s, 完成.
总共 1 (差异 0),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/shuzihan/deploy-demoapp.git
* [new tag] v1.1 -> v1.1
Git的内部数据存储机制
Git有两个主要的数据结构
◼ 存储所有commit和文件内容的不可变、仅附加的对象数据库(即本地版本库)
◼ 暂存数据的可变暂存区(也称为index或cache)
◆充当对象数据库与工作树(工作区的目录结构)之间的连接
◆通过允许暂存commit之前的所有更改避免了每文件更改的提交
◆执行提交时,Git会将状态更改复制到对象数据库并清除暂存区,未暂存的更改仍保留在工作区
对象数据库主要存储如下类型的对象
◼ blob对象
◆存储文件内容,对象名称为文件内容的SHA1 hash码
◆文件的每个版本都会存储为一个blob
◆blob对象仅包含文件数据,并不会存储文件的任何元数据,包括文件名
◆命令git show可用于查看任何blob对象的对象
◼ tree对象
◆存储单级目录结构,即一个目录及其目录中可直接引用到的文件或子目录
◆git show命令也可用于查看tree对象,但git ls-tree命令能显示更丰富的信息
⚫ git ls-tree <Tree_Object>
◼ commit对象
◆指向一个tree对象,它指向的是创建提交时暂存到暂存区的工作树状态的快照
◆包含时间戳、message、username和email等信息
◆还存储有其前一级提交(父提交)的引用
◆有的commit会存在多个父提交,也可能会有多个子提交
◆git show命令或git log –pretty=raw命令可用于查看commit对象
◼ tag对象
◆某个特定commit的引用,用于将该commit标记为特殊用途
◆包含对象名称、对象类型、标签名称、创建标签的人的姓名、message等
◆git cat-file tag <tagName>命令能查看tag对象的内容
Branches
关于Branch
◼ Branch用于跟踪commit,它就像是指定特定提交链上最近一次commit的轻量级可移动的指针
◼ 每当创建新的commit时,Git都会设定Branch指向新建的commit
◼ 对于初始commit,Git会为其分配一个名为master的默认分支
◼ 一个版本库上可以创建多个branch,并且大多数开发人员会为他们处理的每个任务创建一个新的branch
◼ 为了便于引用版本库上当前正在使用的分支,Git 还使用一个名为HEAD的特殊指针
◆用来跟踪当前正在处理的分支,始终指向的是当前分支上的最新提交
◆切换分支时,HEAD也会自动指向目标分支上的最新提交
管理branch
创建分支
◼ 命令:git branch <branchName>
◆git branch devel
切换分支
◼ 命令:git checkout <branchName>
◆git checkout devel
各分支按分别按自己的更改向前演进
分支合并
◼ 命令:git merge <branchName>
◆将指定的其它分支合并至当前分支
◼ 分支合并存在两种情形
◆快进式合并(Fast-Forward Merge)
◆三路合并(3-Way Merge)
[root@ubuntu2004 deploy-demoapp]#git branch -l
* master
[root@ubuntu2004 deploy-demoapp]#git branch devel
[root@ubuntu2004 deploy-demoapp]#git branch -l
devel
* master
[root@ubuntu2004 deploy-demoapp]#git log --oneline
37d6054 (HEAD -> master, tag: v1.1, origin/master, devel) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区
[root@ubuntu2004 deploy-demoapp]#git checkout devel
切换到分支 'devel'
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 devel
无文件要提交,干净的工作区
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 devel
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
secret-demoapp.yaml
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-6.1"
[devel 281e71d] commit-6.1
1 file changed, 2 insertions(+)
create mode 100644 secret-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git log --oneline
281e71d (HEAD -> devel) commit-6.1
37d6054 (tag: v1.1, origin/master, master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git checkout master
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
[root@ubuntu2004 deploy-demoapp]#git log --oneline
37d6054 (HEAD -> master, tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: service.yaml
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-6.2"
[master fa5630a] commit-6.2
1 file changed, 1 insertion(+)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
fa5630a (HEAD -> master) commit-6.2
37d6054 (tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
分支合并
快进式合并
被合并的分支master相对于合并的分支devel来说,自创建分支之后并生成任何新的变动
被合并的分支master只需要将其分支指针指向devel分支的最新一次提交即交
3-Way合并
◼ 两个分支各自沿着自己的演进路线分别创建了新的提交
◼ 合并时需要共同的祖先提交,以及各分支的最新一次提交进行合并
◆如图,它需要commit3、commit4和commit5参与合并操作
◆合并时,若某文件存在无法合并的修改,则意味着存中“冲突”,这里需要用户手动解决冲突后创建提交完成合并
#先切换到目标分支
[root@ubuntu2004 deploy-demoapp]#git branch -l
devel
* master
[root@ubuntu2004 deploy-demoapp]#git merge devel
提示:等待您的编辑器关闭文件...
Merge branch 'devel'
# 请输入一个提交信息以解释此合并的必要性,尤其是将一个更新后的上游分支
# 合并到主题分支。
#
# 以 '#' 开始的行将被忽略,而空的提交说明将终止提交。
".git/MERGE_MSG" 5L, 232C 已写入
Merge made by the 'recursive' strategy.
secret-demoapp.yaml | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 secret-demoapp.yaml
[root@ubuntu2004 deploy-demoapp]#git branch -l
devel
* master
[root@ubuntu2004 deploy-demoapp]#git log --oneline
1dd6d18 (HEAD -> master) Merge branch 'devel'
fa5630a commit-6.2
281e71d (devel) commit-6.1
37d6054 (tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#ls
configmap-demoapp.yaml deployment-demoapp.yaml README.md secret-demoapp.yaml service.yaml
变基(rebase)
关于rebase
◼ 命令:git rebase <baseName>
◼ rebase操作也能完成分支合并
◼ 相对于merge操作将一个分支上的所有变动一次性完成合并来说,rebase操作可以保留一个线性的变更历史
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-7"
[devel abc910f] commit-7
1 file changed, 1 insertion(+)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
abc910f (HEAD -> devel) commit-7
37d6054 (tag: v1.1, origin/master, master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git checkout master
已经位于 'master'
您的分支与上游分支 'origin/master' 一致。
[root@ubuntu2004 deploy-demoapp]#git add .
[root@ubuntu2004 deploy-demoapp]#git commit -m "commit-8"
[master 3f2f04e] commit-8
1 file changed, 2 insertions(+)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
3f2f04e (HEAD -> master) commit-8
37d6054 (tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git checkout devel
切换到分支 'devel'
[root@ubuntu2004 deploy-demoapp]#git rebase master
首先,回退头指针以便在其上重放您的工作...
应用:commit-7
[root@ubuntu2004 deploy-demoapp]#git log --oneline
480b046 (HEAD -> devel) commit-7
3f2f04e (master) commit-8
37d6054 (tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
3f2f04e (HEAD -> master) commit-8
37d6054 (tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
[root@ubuntu2004 deploy-demoapp]#git merge devel -m "commit-8.1"
更新 3f2f04e..480b046
Fast-forward (no commit created; -m option ignored)
service.yaml | 1 +
1 file changed, 1 insertion(+)
[root@ubuntu2004 deploy-demoapp]#git log --oneline
480b046 (HEAD -> master, devel) commit-7
3f2f04e commit-8
37d6054 (tag: v1.1, origin/master) commit-6
7e20ad6 commit-5
48995e0 commit-4
637da77 commit-3
265c05f commit-3
8864b01 commit-2
2323892 Initial Commit
Git中的引用(reference)
引用(reference)是间接指向commit的方式
◼ 直接指向commit的方式是commit对象的sha1 hash码
◼ reference也可被认为是commit hash的别名,对用户来说更友好
◼ git版本库上的各reference以文本文件的形式存储于.git/refs/目录中下的子目录中
◆head目录:HEAD引用,内部的文件名为其指向的分支的名称,内容为相应分支最新一次提交的hash码
◆tags目录:标签引用,内部的文件名为创建的各Tag的名称
◆remotes/<remoteRepoName>目录: remoteRepoName为远程仓库的名称
◼ 带有引用的commit,也可以直接使用“ref/X/Y”路径的形式引用,例如“ref/heads/main”
几个特殊的引用
◼ HEAD:当前签出的提交/分支
◼ FETCH_HEAD:最近从远程仓库中获取的分支
◼ MERGE_HEAD:在git merge操作中,要合并到当分支的那个分支的HEAD
引用规范(refspec)
refspec
◼ 全称为Reference Specification,即引用规范
◼ git通过这种格式来表示本地分支与远程分支的映射关系
◼ 引用规范的格式“+<src>:<dst> ”,其中的+可选
◆<src> 是一个模式(pattern),代表远程版本库中的引用,即远程分支
◆<dst> 是本地跟踪的远程引用的位置,即本地远程分支
◆+ 号告诉 Git 即使在不能快进的情况下也要(强制)更新引用
◼ 本地远程分支就像是远程分支的一个本地镜像,在本地版本库与远程版本库之间起到一个桥梁的作用
◼ 例如本地远程分支:git branch -r
◼ 查看分支间的关联关系:git branch -vv
远程仓库使用总结
设定远程仓库
◼ 添加: git remote add <remote-name> <remote-url>
◼ 列出: git remote -v
◼ 删除: git remote rm <remote-name>
◼ 重命名: git remote rename <old-remote-name> <new-remote-name>
克隆远程仓库
◼ 克隆: git clone <remote-url>
◼ 克隆到指定工作目录: git clone <remote-url> <working-directory-name>
远程协作
◼ 抓取远程仓库所有分支上的变更: git fetch <remote-name>
◼ 抓取远程仓库指定分支上的变更: git fetch <remote-name> <branch-name>
◼ 列出所有远程分支:git branch -r
◼ 将远程分支合并至本地分支,通常应该将存在映射关系(通常为同一个分支名称)的分支进行合并
◆git checkout <branchName>
◆git merge origin/<branchName>
拉取远程仓库上的变更
◼ 拉取并合并当前分支映射的远程分支上的变更至本地工作区:git pull <remote-name>
◼ 相当于如下两个命令生成的结果
◆git fetch <remote-name> <current-branch-name>
◆git merge <remote-name> <current-branch-name>
推送本地变更到远程仓库
◼ 推送指定的分支:git push <remote-name> <branch-name>
◼ 推送本地仓库中的所有分支:git push <remote-name> –all
◼ 推送本地仓库中的所有标签:git push <remote-name> –tag
Git项目团队协作的工作流模型
团队内部共享远程仓库的工作流模型
◼ 常见小型的私有团队成员间的协作
◼ 所有成员被授权push代码到一个共同的远程仓库
◼ 彼此间基于各自专用的feature(或topic)分支进行隔离
◼ 项目维护者在远程仓库上启动master分支
◼ 所有开发人员克隆远程master分支至本地仓库
◼ 每个开发人员创建一个本地feature分支(例如feature/user1-x)进行特性开发
◼ 某位开发人员的特性开发完成后,创建一个pull request请求通知其它人review他的代码,所有人都可以提出反馈和建议
◼ 一旦被接受,其分支将由项目维护者合并至远程仓库的master分支
◼ 常见小型的私有团队成员间的协作
◼ 所有成员被授权push代码到一个共同的远程仓库
◼ 彼此间基于各自专用的feature(或topic)分支进行隔离
◼ 工作流程
◆项目维护者在远程仓库上启动master分支
◆所有开发人员克隆远程master分支至本地仓库
◆每个开发人员创建一个本地feature分支(例如feature/user1-x)进行特性开发
◆某位开发人员的特性开发完成后,创建一个pull request请求通知其它人review他的代码,所有人都可以提出反馈和建议
◆一旦被接受,其分支将由项目维护者合并至远程仓库的master分支
基于Fork的工作流
◼ 该模型无须共享的远程版本库,每位开发人员将会fork协作时使用的远程仓库至自己的个人账户下,生成一个个人专有的远程仓库
◼ 开发人员克隆自有的远程仓库至本地,并基于一个feature分支完成feature开发
◼ 工作流
◆项目维护者将本地仓库推送至远程主机,并授权各贡献者有权读取该仓库
◆各代码贡献人员fork项目至同一远程主机上的个人账户下
◆某开发人员克隆自己账户下基于fork生成的仓库至本地
⚫ 本地远程分支将指向自己账户下的远程分支,而非上游(fork的项目)仓库中的远程分支
◆在本地仓库上添加名为upstream的上游仓库,以跟踪原始仓库,并拉取原始仓库中的所有变更至本地
◆在本地仓库创建一个新的feature分支进行feature开发,并日常推送变更至自己的远程仓库
⚫ 启动编码日常的“编辑、暂存、提交和推送”循环
◆feature开发完成后,通过pull request通过项目维护者review代码
⚫ 创建pull request时,需要明确指定自己的仓库名和分支名,以及上游的仓库名和分支名
◆项目维护者审核代码
⚫ 打回并要求原作者更正时,开发人员启动开发任务修正代码并再次创建PR请求
⚫ 接受代码时,项目维护者可通过merge操作完成分支合并
◆所有的代码贡献者需要拉取上游仓库中的变更至本地版本库
Git分支模型
分支管理是现代版本控制系统在记录版本和变更记录之外的另一个非常重要的功能
◼ 团队于同一个项目上协作时,分支管理是不可或缺的重要功能,因为它
◆ 隔离不同开发人员的改动,为每个人提供一个相对独立的空间
◆ 隔离团队根据布节奏要实现的代码提交、审核、集成和测试等工作
◼ “如果说多人软件协作项目中有一个灵魂的话,我认为,这个灵魂就是分支策略。可以说,分支策略就是软件协作模式和发布模式的风向标。选择一种符合 DevOps 开发模式的分支策略,对于 DevOps 的实践落地也会大有帮助。”—— 石雪峰
几种常见的分支模型
◼ master
◼ master/develop
◼ master/develop/feature
◼ master/develop/feature/release
◼ master/develop/feature/release/bugfix
◼ git-flow
分支模型
单分支模型
◼ 开发、测试和发布都在master分支上完成
◼ 工作流程
◆ ~$ git checkout master
⚫ 完成 开发、测试和发布
◼ 特性:简单,但开发、测试和发布彼此影响,仅适用于单feature且无构建过程的场景
master/develop
◼ 工作模型
◆ master:主分支
◆ develop:开发分支,完成后合并至master分支;短期分支
◼ 工作流程
◆ ~$ git checkout -b develop # from master
◆ ~$ git rebase master
⚫ 完成 开发、测试和发布
◆ ~$ git checkout master
◆ ~$ git merge develop
◆ ~$ git branch –delete develop
◼ 特性:develop分支的开发不会影响到master分支的构建过程,但不利于同时开发多个feature;适用于单feature,可从master执行构建的场景;
master/develop/feature
◼ 工作模型
◆ master 和 develop是主分支
◆ 开发人员工作在各自的feature分支上
⚫feature分支经过开发、模块测试后合并到develop分支
◆ develop分支代码经过系统测试,release之后合并到master分支
⚫ release是短期分支
◼ 工作流程
◆ git chechout -b feature # from develop
⚫ 完成 开发和特性测试
◆ git checkout develop
◆ git merge feature
◆ git branch –delete feature
⚫ 完成集成测试和发布
◆ git checkout master
◆ git merge develop
◼ 特性:多个feature有利于更大规模的合作,但release独立分支中的bug修复变更与develop上的变更可能会导致冲突;因而,适用于多feature,develop在release过程中不会修改的场景;
master/develop/feature/release
◼ 工作模型
◆ 在前一分支模型的基础上,使用单独的release分支进行构建和bug修复
◼ 工作流程
◆ git chechout -b feature # from develop
⚫ 完成 开发 和 特性测试
◆ git checkout develop
◆ git merge feature
◆ git branch –delete feature
◆ git checkout -b release # from develop
⚫ 完成 测试、bug修复和发布
◆ git checkout develop
◆ git merge release # 将release合并至develop
◆ git checkout master
◆ git merge release # 将release合并至master
◆ git branch –delete release # 删除releae分支
◼ 特性:避免了因发布操作而阻塞了develop分支上的变更,但release分支存在的时间越长,导致develop合并冲突的可能性越大;因此,适用于多feature开发,但develop功能不受release影响的场景
master/develop/feature/release/hotfix
◼ 特性
◆ 从master单独拉一个短期的hotfix分支进行问题修复
◼ 工作流程
◆ git checkout -b hotfix # from master
⚫ 完成 修复 和 测试
◆ git checkout master
◆ git merge hotfix # 合并hotfix分支至master
◆ git checkout develop
◆ git merge hotfix # 合并hotfix分支至develop
◆ git branch –delete hotfix # 删除hotfix分支
◆ git checkout release # from develop
◆ git rebase develop # release分支变基
⚫ 在release分支上完成 测试和发布
◆ git checkout develop
◆ git merge release # 将release分支合并至develop
◆ git checkout master
◆ git merge release # 将release分支合并至master
◆ git branch –delete release # 删除release分支
git-flow模型
git-flow的要点
◼ master 只能用来存储产品代码
◆ 不能直接工作在 master 分支上 ,而是在其他指定的、独立的特性分支中
◆ 避免直接提交改动到 master 分支上也是很多工作流程的一个共同准则
◼ develop 是 进行任何新的开发的基础分支
◆ develop是任何feature分支的父分支
◆ 用于汇集所有feature上的代码,并在必要时合并至master分支
◼ develop分支上的代码来自于 feature、release 和 bugfix 分支
◼ master分支上的代码来自于 release 和 bugfix 分支
◼ master 和develop都是长期分支,它们会存活在项目的整个生命周期中,而各feature分支、release分支和bugfix分支均为临时分支,每次的使命完成后即被删除