参考
版本管理
flowchart LR
%% 样式定义
classDef localBox fill:#f9fafb,stroke:#9ca3af,stroke-width:2px,stroke-dasharray: 5 5;
classDef remoteBox fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,stroke-dasharray: 5 5;
classDef ws fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a8a;
classDef sa fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f;
classDef lr fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b;
classDef rr fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95;
subgraph Local_Machine ["💻 本地环境 Local Machine"]
direction LR
WS["📂 Work Space 工作区\nModified / Untracked"]
SA["📦 Stage Area 暂存区\nStaged"]
LR_Node["🗄️ Local Repo 本地版本库\nCommitted 本地分支"]
WS -- "1. git add" --> SA
SA -- "2. git commit" --> LR_Node
LR_Node -- "git restore 丢弃工作区修改" --> WS
SA -- "git restore -staged 取消暂存" --> WS
end
subgraph Remote_Server ["☁️ 远程服务器 Remote Server"]
direction TB
RR["🌐 Remote Repo 远程仓库\n远程分支 origin/main"]
end
%% 跨环境交互
LR_Node -- "3. git push 推送本地提交" --> RR
RR -- "4. git fetch 拉取远程更新" --> LR_Node
RR -- "5. git pull 拉取并自动合并" --> WS
RR -. "0. git clone 首次克隆项目" .-> WS
%% 应用样式
class Local_Machine localBox;
class Remote_Server remoteBox;
class WS ws;
class SA sa;
class LR_Node lr;
class RR rr;
概念
work space(工作区)
work space(工作区)是本地文件系统中存储库目录, 用于存放源代码
开发者在work space内进行代码编辑、修改和删除等操作, 文件所有更改都会反映在work space
work space中, 文件有三种状态:
-
modified(已修改), 文件已修改, 还未添加到stage area -
staged(已暂存), 文件已修改, 并且已添加到stage area, 准备提交到版本库 -
committed(已提交), 文件已提交到版本库
flowchart LR
%% 区域背景样式
classDef bg_ws fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,stroke-dasharray: 5 5;
classDef bg_sa fill:#fffbeb,stroke:#f59e0b,stroke-width:2px,stroke-dasharray: 5 5;
classDef bg_lr fill:#ecfdf5,stroke:#10b981,stroke-width:2px,stroke-dasharray: 5 5;
%% 状态节点样式
classDef state_u fill:#f8fafc,stroke:#94a3b8,stroke-width:2px,color:#475569;
classDef state_m fill:#fee2e2,stroke:#ef4444,stroke-width:3px,color:#991b1b,font-weight:bold;
classDef state_s fill:#fef3c7,stroke:#f59e0b,stroke-width:3px,color:#92400e,font-weight:bold;
classDef state_c fill:#d1fae5,stroke:#10b981,stroke-width:3px,color:#065f46,font-weight:bold;
subgraph WS_Sub ["📂 Work Space 工作区 - 本地文件系统"]
direction TB
U["📄 Untracked 未跟踪\n新创建的文件, Git 尚未纳管"]
M["📝 Modified 已修改\n文件内容已更改, 但还未添加到暂存区"]
end
subgraph SA_Sub ["📦 Stage Area 暂存区 / Index"]
direction TB
S["📋 Staged 已暂存\n文件已修改并添加到暂存区, 准备提交"]
end
subgraph LR_Sub ["🗄️ Local Repository 本地版本库"]
direction TB
C["✅ Committed 已提交\n文件快照已安全保存至本地数据库"]
end
%% 正向流转 提交工作流
U -- "1. 首次 git add" --> S
M -- "2. git add 将修改放入暂存区" --> S
S -- "3. git commit 将暂存区永久保存" --> C
%% 逆向与修改流转 撤回与再编辑
C -- "4. 在工作区再次编辑该文件" --> M
S -- "5. git restore -staged 取消暂存" --> M
M -- "6. git restore 丢弃修改恢复原状" --> C
%% 应用样式
class WS_Sub bg_ws;
class SA_Sub bg_sa;
class LR_Sub bg_lr;
class U state_u;
class M state_m;
class S state_s;
class C state_c;
stage area (暂存区)
stage area(暂存区)本质是数据库
stage area充当缓冲, 将work space的修改先保存到stage area, 再提交到local repository
local repository (本地仓库)
local repository位于开发者的计算机中, 包含所有的项目提交历史修改后文件提交到local repository, 成为版本历史一部分
remote repository (远程仓库)
远程仓库存储在远程服务器上, 用于备份、共享和协作工作, 允许开发者推送本地更改或拉取他人更改
拥有三种操作:
-
clone: 克隆远程仓库到本地 -
push: 将本地更改推送到远程仓库 -
pull: 将远程更改拉取到本地
初始化
将当前目录初始化为local repository
git init
执行后自动创建隐藏目录.git/, 用于管理版本库
.git/位于local repository根目录下, 包含仓库所有元数据和信息, 用于跟踪和管理版本控制
初始化后, 当前目录及子目录和文件都处于work space(工作区)
- 示例, 将
git_test/初始化为local repository
git init
终端显示
Initialized empty Git repository in /home/dmjcb/Documents/code/git_test/.git/
状态
查看work space中文件状态
git status
- 未添加文件, 显示
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to tarck)
修改
新增文件, 状态为untracked files, 终端里显示为红色, 表示还未添加到stage area
撤销
- 撤销
work space内文件修改
将文件恢复到上一次提交状态
git restore 文件名
- 撤销
work space内所删除文件
从上一次提交中恢复被删除文件到work space
git checkout -- 文件名
添加
将文件从work space转移到stage area
git add 文件名(如果为 . 表示全部文件)
撤回
将已添加至stage area的文件撤回至work space
git rm --cached 文件名
提交
将stage area文件提交至local repository
git commit (-m "commit信息")
- 示例, 提交main.cpp
若未设置邮箱用户名, 需先设置
git config --global user.email "邮箱"
git config --global user.name "用户名"
设置完成后正常提交
查看记录
查看每次提交记录, 包含commit ID、作者、提交时间信息
git log
示例显示
commit 69c26f0f7489e0fed9d22a83d12b43d6ddfbd95e (HEAD -> main, origin/main, origin/HEAD)
Author: dmjcb <dmjcb@outlook.com>
Date: Wed Jun 10 21:09:58 2026 +0800
modify
commit b02b3331ad2a4820f4b7d3ea47c3d78f8a5ed58a
Author: dmjcb <dmjcb@outlook.com>
Date: Mon Jun 8 23:07:55 2026 +0800
update
:
修改commit内容
假设需在commit后修改内容提交内容
- 修改最近一次
commit
git commit --amend
回退
flowchart TB
%% 区域背景样式
classDef bg_ws fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,stroke-dasharray: 5 5;
classDef bg_sa fill:#fffbeb,stroke:#f59e0b,stroke-width:2px,stroke-dasharray: 5 5;
classDef bg_lr fill:#ecfdf5,stroke:#10b981,stroke-width:2px,stroke-dasharray: 5 5;
%% 状态节点样式
classDef state_m fill:#fee2e2,stroke:#ef4444,stroke-width:3px,color:#991b1b,font-weight:bold;
classDef state_s fill:#fef3c7,stroke:#f59e0b,stroke-width:3px,color:#92400e,font-weight:bold;
classDef state_c fill:#d1fae5,stroke:#10b981,stroke-width:3px,color:#065f46,font-weight:bold;
classDef state_c_prev fill:#a7f3d0,stroke:#059669,stroke-width:3px,color:#064e3b,font-weight:bold,stroke-dasharray: 5 5;
subgraph WS_Sub ["📂 Work Space 工作区"]
direction TB
M["📝 Modified 已修改\n文件已更改, 未暂存"]
end
subgraph SA_Sub ["📦 Stage Area 暂存区"]
direction TB
S["📋 Staged 已暂存\n已添加到暂存区, 准备提交"]
end
subgraph LR_Sub ["🗄️ Local Repository 本地版本库"]
direction TB
C["✅ Committed 当前已提交\n当前版本 HEAD 已安全保存"]
C_Prev["⏪ Committed 上一版本\nHEAD~1 或 指定 commit_id"]
end
%% ================= 回退操作 逆向流转 使用虚线 =================
%% 1. 未暂存回退
M -. "1. 未暂存回退 git restore 丢弃修改恢复干净状态" .-> C
%% 2. 已暂存回退
S -. "2. 已暂存回退 git restore --staged 仅撤回add保留修改" .-> M
%% 3. 已 commit 回退 --soft
C -. "3. soft回退 git reset --soft 撤销commit不撤销add" .-> S
%% 4. 已 commit 回退 --mixed
C -. "4. mixed回退 git reset --mixed 撤销commit并撤销add" .-> M
%% 5. 已 commit 回退 --hard
C -. "5. hard回退 git reset --hard 强制删除改动彻底恢复" .-> C_Prev
%% 应用样式
class WS_Sub bg_ws;
class SA_Sub bg_sa;
class LR_Sub bg_lr;
class M state_m;
class S state_s;
class C state_c;
class C_Prev state_c_prev;
设原始test.txt
origin origin origin origin origin
设修改后test.txt
modify modify modify modify modify
未暂存回退
用于已修改但未添加到stage area(即未执行git add时)回退
文件会恢复至修改前状态
git checkout -- [文件名](为 . 时表示全部文件)
已暂存回退
用于已修改并添加到stage area(已执行git add)回退
注意! git reset只撤回添加操作, 不会撤回文件修改
- 回退指定文件
git reset HEAD 文件名
- 回退所有修改
git reset
执行后文件被撤回到work space, 但修改后内容不变
已commit退回
用于已修改并已commit回退, 分三种情况
HEAD 表示当前提交, 上版本表示为HEAD^, 前100个版本表示为HEAD~100
reset --hard
删除工作空间改动, 撤销git commit, 撤销git add .
- 回退到上次commit
git reset --hard HEAD^
- 回退到任意版本
git reset --hard 某次commit_id
reset --soft
不删除工作空间改动, 撤销git commit, 不撤销git add .
git reset --soft HEAD^
回退后, 被修改文件会在stage area, 且文件自上次修改后内容不会删除
reset --mixed
不删除工作空间改动, 撤销git commit, 并撤销git add .
git reset --mixed HEAD^
回退后, 修改后文件会在work space, 且文件自上次修改后内容不会删除
分支
分支允许在代码库中创建多个开发线
gitGraph
commit id: "main-1"
commit id: "main-2"
branch dev
checkout dev
commit id: "dev-1"
checkout main
branch fix
checkout fix
commit id: "fix-1"
每个分支本质上都是代码库一个快照, 可在不影响其他分支情况下独立进行开发和修改
flowchart LR
%% 样式定义
classDef center fill:#1e293b,stroke:#0f172a,stroke-width:3px,color:#ffffff,font-weight:bold;
classDef main_iso fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a8a,font-weight:bold;
classDef sub_iso fill:#eff6ff,stroke:#93c5fd,stroke-width:1px,color:#1e40af;
classDef main_mrg fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b,font-weight:bold;
classDef sub_mrg fill:#ecfdf5,stroke:#6ee7b7,stroke-width:1px,color:#065f46;
classDef main_ver fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f,font-weight:bold;
classDef sub_ver fill:#fffbeb,stroke:#fcd34d,stroke-width:1px,color:#92400e;
%% 中心节点
Center["🌿 Git Branch\n核心特点"]
%% 1. 代码隔离
IsoMain["🛡️ 代码隔离"]
IsoSub["🔒 提供安全的独立沙盒环境\n分支间代码独立, 修改互不干扰"]
%% 2. 代码合并
MrgMain["🔀 代码合并"]
MrgMain2["🧩 通过 Merge 或 Rebase 操作\n将分支更改安全应用到目标分支"]
%% 3. 并行开发
VerMain["🚀 并行开发"]
VerSub["🛤️ 支持多分支工作流 如 Git Flow\n同时跟踪不同版本或开发阶段"]
%% 连线关系
Center ==>|1| IsoMain
IsoMain --> IsoSub
Center ==>|2| MrgMain
MrgMain --> MrgMain2
Center ==>|3| VerMain
VerMain --> VerSub
%% 应用样式
class Center center;
class IsoMain main_iso;
class IsoSub sub_iso;
class MrgMain main_mrg;
class MrgMain2 sub_mrg;
class VerMain main_ver;
class VerSub sub_ver;
查看
查看当前分支
初始化仓库时默认创建master(main)分支
git branch (-a, 表示所有分支)
- 示例, 查看仓库所有分支
git branch
查看远程分支
git branch -r
创建
仅创建分支
git branch 分支名
创建分支并切换
git switch -c 分支名
- 示例, 创建dev分支并切换
gitGraph
commit id: "main 1"
commit id: "main 2"
branch dev
checkout dev
commit id: "dev 1"
git switch -c dev
修改
切换分支
git switch 分支名
切换回master分支
git switch master
重命名
重命名当前分支
git branch -M 新分支名
删除
git branch -d 分支名
删除dev分支
git branch -d dev
输出
Deleted branch dev (was .....)
合并
合并代码时分两种情况,
(1) 完全合并, 需要另一个分支所有变动, 使用 git merge
(2) 选择合并, 只需要部分变动(某几次提交), 使用 git cherry-pick
完全合并
git merge 待合并分支名
正常合并
git switch B分支
git merge A分支
将dev分支合并到master分支
master分支上提交
gitGraph
commit id: "origin"
新建dev分支并切换, 进行两次提交
gitGraph
commit id: "origin"
branch dev
checkout dev
commit id: "modify first"
commit id: "modify second"
切换回master分支, 合并dev分支所有提交
gitGraph
commit id: "origin"
branch dev
switch dev
commit id: "modify first"
commit id: "modify second"
switch main
merge dev id: "merge dev"
冲突情况
两个分支合并时可能会出现冲突错误
两分支修改同文件同位置, 导致合并冲突
master分支上创建 test.txt, 并提交
// test.txt
master master master master master
gitGraph
commit id: "master first commit"
创建dev分支, 修改 test.txt, 并提交
// test.txt
dev dev dev dev dev
gitGraph
commit id: "master first commit"
branch dev
switch dev
commit id: "dev first commit"
切回master分支, 再修改test.txt 提交
// test.txt
[master] upate upate upate upate upate
gitGraph
commit id: "master first commit"
branch dev
switch dev
commit id: "dev first commit"
switch main
commit id: "master second commit"
将dev分支合并到master分支
gitGraph
commit id: "master first commit"
branch dev
switch dev
commit id: "dev first commit"
switch main
commit id: "master second commit"
merge dev type: REVERSE
提示冲突, 因两个分支都修改文件同一位置所导致, test.txt 内容如下
<<<<<<< HEAD
[master] upate upate upate upate upate
=======
dev dev dev dev dev
>>>>>>> dev
<<<<<<< 表示当前修改
>>>>>>> 表示传入修改
假如保留双方更改, 需手动修改冲突文件, 提交
// test.txt
[master] upate upate upate upate upate
dev dev dev dev dev
gitGraph
commit id: "master first commit"
branch dev
switch dev
commit id: "dev first commit"
switch main
commit id: "master second commit"
merge dev id: "merge dev"
选择合并
git cherry-pick 可选择其他分支单次、多次提交, 并作为新提交引入到当前分支
git cherry-pick 某次commit_id
- 示例, 将pick分支上某次提交合并到main分支
master分支上创建test.txt, 并提交
master master master master master
gitGraph
commit id: "master 1 commit"
切换到pick分支, 对test.txt进行三次修改并提交
第一次修改
master master master master master
+ [pick] fix 1
第二次修改
master create origin
[pick] fix 1
+ [pick] fix 2
第三次修改
master create origin
[pick] fix 1
[pick] fix 2
+ [pick] fix 3
gitGraph
commit id: "master 1 commit"
branch pick
switch pick
commit id: "pick 1 commit"
commit id: "pick 2 commit"
commit id: "pick 3 commit"
(3) 选择合并
将pick分支 commit “pick 2 commit”提交合并到master分支
gitGraph
commit id: "master 1 commit"
branch pick
switch pick
commit id: "pick 1 commit"
commit id: "pick 2 commit"
commit id: "pick 3 commit"
switch main
cherry-pick id: "pick 2 commit"
如果有冲突, 需手动解决
后续可用git cherry-pick --continue 继续合并其他提交, 或用git cherry-pick --abort 放弃合并
应用多提交
按顺序逐一应用提交到当前分支上
git cherry-pick commit1 commit2...
应用范围提交
可指定提交范围应用
git cherry-pick 开始commit^结束commit
标签
tag(标签)标记特定commit, 用于记录项目开发过程中重要里程碑或发布版本
创建
指定commit
git tag 标签名 (某次commit_id, 为空表示最新commit)
- 示例, 使用最新commit作标签
git tag v1.0
gitGraph
commit id: "master 1 commit"
commit id: "cherry-pick pick 2 commit" tag: "v1.0"
- 示例, 使用commit 52e3a21e149837607fffe8126…作标签v0.9
git tag v0.9 52e3a21e149837607fffe8126
gitGraph
commit id: "master 1 commit" tag: "v0.9"
commit id: "cherry-pick pick 2 commit" tag: "v1.0"
添加描述信息
git tag -a 标签名 -m 描述信息 某次commit_id
删除
删除本地tag
git tag -d 标签名
删除远程tag
git push origin :refs/tags/标签名
查看
git tag
- 示例, 创建标签后查看, 终端显示
v0.9
v1.0
远程仓库
remote repository通常位于远程服务器, 如github、gitlab、bitbucket或gitee等代码托管平台
克隆
通过克隆可将remote repository内容复制到本地, 创建一个与之相同local repository
完全克隆
克隆remote repository所有提交记录
git clone 仓库地址 (存放路径)
拉取最近记录
git clone --depth 提交次数 参数地址
查看
远程仓库地址
git remote -v
删除
按名称删除
git remote rm 远程主机名
- 示例, 删除远程仓库origin
git remote rm origin
按URL删除
git remote set-url --delete origin 远程仓库地址
添加
git remote add 远程主机名 远程仓库地址
拉取
从远程仓库获取更新, 使本地仓库保持同步
git pull 远程主机名 远程分支名:本地分支名
若远程分支是与当前分支合并, 可简写为git pull
手动合并
git pull 过程可分解为,
(1) 通过git fetch 从远程主机将远程最新内容拉到本地, 用户可决定是否合并到本地分支中
git fetch 远程主机名 远程分支名
取回更新后, 会返回FETCH_HEAD, 指某个分支在服务器上最新状态
通过git log -p FETCH_HEAD 查看更新文件名、作者和时间、代码, 可以通过这些信息来判断是否产生冲突
(2) 通过git merge 将拉取下来最新内容合并到当前所在分支中, 若提示冲突, 需手动解冲突后提交
git merge FETCH_HEAD
推送
git push 将本地分支更改上传到远程仓库
git push 远程主机名 本地分支名:远程分支名
设存在远程仓库http://192.168.1.128:3000/test_user/demo.git
推送已创建仓库
git remote add origin 仓库地址
git push origin 分支
推送本地分支
git push 远程主机名 本地分支名:远程分支名
若本地分支与远程分支一致, 则可简写为git push
- 设置跟踪关系(可选)
为在以后推送中不再每次指定远程分支名, 可使用-u(或–set-upstream)标志来设置跟踪关系
git push -u 远程仓库名 本地分支名
设置跟踪关系后, 后续只需调用git push即可将更改推送到所关联远程分支
- 同时推送到多仓库
添加多个远程仓库地址, 就可同步push到多个库
git remote set-url --add origin 远程仓库地址
推送本地标签
git push origin 分支名 --tags
子模块
子模块(git submodules)允许将一个git仓库作为另一个git仓库的子目录
flowchart LR
%% 样式定义
classDef center fill:#1e293b,stroke:#0f172a,stroke-width:3px,color:#ffffff,font-weight:bold,font-size:16px;
classDef main_dep fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a8a,font-weight:bold;
classDef sub_dep fill:#eff6ff,stroke:#93c5fd,stroke-width:1px,color:#1e40af;
classDef main_ver fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b,font-weight:bold;
classDef sub_ver fill:#ecfdf5,stroke:#6ee7b7,stroke-width:1px,color:#065f46;
classDef main_reuse fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f,font-weight:bold;
classDef sub_reuse fill:#fffbeb,stroke:#fcd34d,stroke-width:1px,color:#92400e;
classDef main_iso fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95,font-weight:bold;
classDef sub_iso fill:#f5f3ff,stroke:#c4b5fd,stroke-width:1px,color:#5b21b6;
%% 中心节点 (使用 Markdown ** 加粗代替 <b>, 提升 v11 兼容性)
Center🎯 git submodule \n核心作用
%% 1. 依赖管理分支
DepMain("📦 依赖管理")
DepSub["🔗 将三方库作为子模块包含\n方便管理复杂的依赖关系"]
%% 2. 版本控制分支
VerMain("🏷️ 版本控制")
VerSub["🔄 可单独跟踪和更新\n子模块的特定 Commit 版本"]
%% 3. 代码复用分支
ReuseMain("♻️ 代码复用")
ReuseSub["📂 多个项目共享相同代码库\n无需物理复制代码文件"]
%% 4. 隔离性分支
IsoMain("🛡️ 隔离性")
IsoSub["🔒 在不影响主项目历史的情况下\n独立更新或修改子模块"]
%% 连线关系 (v11 推荐使用 == text ==> 语法表示带文本的加粗线)
Center == 1 ==> DepMain
DepMain --> DepSub
Center == 2 ==> VerMain
VerMain --> VerSub
Center == 3 ==> ReuseMain
ReuseMain --> ReuseSub
Center == 4 ==> IsoMain
IsoMain --> IsoSub
%% 应用样式
class Center center;
class DepMain main_dep;
class DepSub sub_dep;
class VerMain main_ver;
class VerSub sub_ver;
class ReuseMain main_reuse;
class ReuseSub sub_reuse;
class IsoMain main_iso;
class IsoSub sub_iso;
初始化
自动拉取
使用--recursive在克隆项目同时拉取子模块
git clone --recursive 项目地址
手动拉取
若克隆项目时未拉取子模块, 可在主项目根目录手动拉取
git submodule init
git submodule update --recursive
查看
git submodule
添加
git submodule add 子模块仓库地址 (子模块路径)
修改
更新
更新子模块以获取最新改动
git submodule update --remote
提交
子模块修改后, 与普通项目提交方式一致
删除
移除子模块
git submodule deinit -f 子模块本地路径
删除子模块目录
git rm 子模块本地路径
配置
下载
查看
系统配置
git config --system --list
用户配置
git config --global --list
修改
用户信息
- 配置用户名(必须)
git config --global user.name "用户名"
- 配置邮箱(必须)
git config --global user.email "邮箱"
设置
- 配置编辑器
git config --global core.editor "code -w"
- 防止中文乱码
git config --global core.quotepath false
- 启用文件大小写敏感
git config --global core.ignorecase false
- 设置代理
git config --global http.proxy 代理地址
- 取消代理
git config --global --unset http.proxy
使用
本地使用
- 示例, 本地新建项目git_demo, 进入git_demo/后执行
git init
git_demo/中会出现.git/隐藏目录
新建hello.md文件
# Hello World
提交
git add .
git commmit -m "初次提交"
github使用
设置
注册github账号
- 配置公钥
github设置公钥后, 上传下载即可免输入密码
复制本地用户.ssh/公钥id_rsa.pub值, 添加到github settings中SSH and GPG keys中
上传
本地项目上传到github仓库上
flowchart TD
%% 样式定义 (延续前文色彩体系)
classDef startEnd fill:#f8fafc,stroke:#64748b,stroke-width:3px,color:#334155,font-weight:bold,font-size:16px;
classDef ws fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a8a,font-weight:bold;
classDef sa fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f,font-weight:bold;
classDef lr fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b,font-weight:bold;
classDef rr fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95,font-weight:bold;
classDef decision fill:#ffe4e6,stroke:#e11d48,stroke-width:2px,color:#9f1239,font-weight:bold;
Start(("🚀 开始开发"))
End(("🏁 同步完成"))
subgraph Local ["💻 阶段一:本地工作流 (Local Workflow)"]
direction TB
WS["📝 <b>工作区修改</b><br/>(Work Space)"]
SA["📦 <b>暂存区快照</b><br/>(Stage Area)"]
LR["🗄️ <b>本地库提交</b><br/>(Local Repo)"]
WS -- "1. git add ." --> SA
SA -- "2. git commit -m 'msg'" --> LR
end
Decision{"🔗 是否首次推送?<br/>(本地是否已关联远程仓库)"}
subgraph Remote ["☁️ 阶段二:远程推送 (Remote Push)"]
direction TB
SetRemote["⚙️ <b>配置远程地址</b><br/><code>git remote add origin <url></code>"]
PushFirst["🚀 <b>首次推送并绑定上游</b><br/><code>git push -u origin <branch></code>"]
PushNormal["🔄 <b>常规推送</b><br/><code>git push</code>"]
RR["🌐 <b>远程仓库更新</b><br/>(Remote Repo)"]
end
%% 连线
Start --> WS
LR --> Decision
Decision -- "Y (首次)" --> SetRemote --> PushFirst --> RR
Decision -- "N (非首次)" --> PushNormal --> RR
RR --> End
%% 应用样式
class Start,End startEnd;
class WS ws;
class SA sa;
class LR lr;
class RR rr;
class Decision decision;
后续提交可直接使用git push推送
下载
将github上项目下载(更新)到本地
flowchart TD
%% 样式定义 (延续前文色彩体系)
classDef startEnd fill:#f8fafc,stroke:#64748b,stroke-width:3px,color:#334155,font-weight:bold,font-size:16px;
classDef decision fill:#ffe4e6,stroke:#e11d48,stroke-width:2px,color:#9f1239,font-weight:bold;
classDef cloneNode fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95,font-weight:bold;
classDef pullNode fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a8a,font-weight:bold;
classDef fetchNode fill:#d1fae5,stroke:#059669,stroke-width:2px,color:#064e3b,font-weight:bold;
Start(("🚀 开始获取代码"))
End(("🏁 同步完成"))
Decision1{"本地是否已有<br/>该项目的 Git 仓库?"}
subgraph CloneFlow ["📥 场景一:首次获取项目"]
direction TB
Clone["🌐 <b>克隆远程仓库</b><br/><code>git clone <url></code><br/><i>自动初始化本地仓库、下载所有历史并关联远程</i>"]
end
Decision2{"选择日常同步策略<br/>(本地已有仓库)"}
subgraph PullFlow ["⚡ 场景二:快捷同步策略"]
direction TB
Pull["🔄 <b>拉取并自动合并</b><br/><code>git pull</code><br/><i>等同于 fetch + merge<br/>适合工作区干净、追求效率的场景</i>"]
end
subgraph FetchFlow ["🛡️ 场景三:安全审查策略 (团队协作推荐)"]
direction TB
Fetch["📥 <b>1. 安全拉取更新</b><br/><code>git fetch</code><br/><i>仅下载更新到本地远程跟踪分支<br/>绝对不修改当前工作区代码</i>"]
Review["🔍 <b>2. 审查代码差异</b><br/><code>git log</code> / <code>git diff</code><br/><i>查看远程到底更新了什么内容</i>"]
Merge["🔀 <b>3. 手动合并或变基</b><br/><code>git merge</code> 或 <code>git rebase</code><br/><i>确认无误后, 将更新合并到本地分支</i>"]
Fetch --> Review --> Merge
end
%% 连线
Start --> Decision1
Decision1 -- "N (没有, 首次获取)" --> Clone --> End
Decision1 -- "Y (已有, 日常更新)" --> Decision2
Decision2 -- "追求快捷<br/>(工作区干净)" --> Pull --> End
Decision2 -- "追求安全<br/>(需审查/防冲突)" --> FetchFlow --> End
%% 应用样式
class Start,End startEnd;
class Decision1,Decision2 decision;
class Clone cloneNode;
class Pull pullNode;
class Fetch,Review,Merge fetchNode;
- 克隆
首次将项目下载到本地
git clone 仓库地址
PR
PR(Pull Request)功能允许个人向其他项目贡献代码, 通常用于团队协作和开源项目贡献中
当开发者修改他人代码后, 可以通过PR将修改告知给代码原作者, 请求他合并这些修改
flowchart TD
%% 样式定义 (延续前文色彩体系)
classDef contributor fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e3a8a,font-weight:bold;
classDef platform fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#4c1d95,font-weight:bold;
classDef success fill:#d1fae5,stroke:#059669,stroke-width:3px,color:#064e3b,font-weight:bold,font-size:16px;
classDef bgBox fill:#f8fafc,stroke:#94a3b8,stroke-width:2px,stroke-dasharray: 5 5;
subgraph Contributor ["👨💻 阶段一:贡献者本地与个人远程操作"]
direction TB
Fork["🍴 <b>1. Fork 仓库</b><br/>在 GitHub/GitLab 平台上<br/>将原仓库复制到自己的账号下"]
Clone["💻 <b>2. Clone & 创建特性分支</b><br/><code>git clone <your_fork_url></code><br/><code>git checkout -b feature-x</code>"]
Push["🚀 <b>3. 修改代码 & 推送</b><br/>在本地编写代码并 commit<br/><code>git push origin feature-x</code>"]
Fork --> Clone --> Push
end
subgraph Platform ["☁️ 阶段二:平台交互与维护者审查"]
direction TB
PR["🔀 <b>4. 创建 PR (Pull Request)</b><br/>在平台上发起合并请求:<br/>请求将 Fork 仓库的 <code>feature-x</code> 分支<br/>合并到原仓库的 <code>main</code> 分支"]
Review["🔍 <b>5. 代码审查 (Code Review)</b><br/>维护者审查代码、CI 自动运行测试<br/>若有问题, 贡献者在本地修改后再次 push<br/><i>(PR 会自动更新)</i>"]
Merge["✅ <b>6. 合并代码 (Merge PR)</b><br/>审查通过, 维护者点击 Merge<br/>代码正式合入原项目主干, PR 关闭"]
PR --> Review --> Merge
end
%% 跨区连线
Push ==>|"触发平台操作<br/>(在网页端点击 New PR)"| PR
%% 应用样式
class Contributor,Platform bgBox;
class Fork,Clone,Push contributor;
class PR,Review platform;
class Merge success;
工具
repo
mkdir -p ~/repo
cd ~/repo
git clone https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
cd ~/repo/git-repo
sudo chmod +x ./repo
sudo cp ./repo /usr/bin/
设置环境变量
变量~/.bashrc, 追加
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
source ~/.bashrc