git使用

 

参考

版本管理

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

  1. reset --hard

删除工作空间改动, 撤销git commit, 撤销git add .

  • 回退到上次commit
git reset --hard HEAD^
  • 回退到任意版本
git reset --hard 某次commit_id
  1. reset --soft

不删除工作空间改动, 撤销git commit, 不撤销git add .

git reset --soft HEAD^

回退后, 被修改文件会在stage area, 且文件自上次修改后内容不会删除

  1. 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通常位于远程服务器, 如githubgitlabbitbucketgitee等代码托管平台

克隆

通过克隆可将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客户端官网下载

查看

系统配置

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 &lt;url&gt;</code>"]
        PushFirst["🚀 <b>首次推送并绑定上游</b><br/><code>git push -u origin &lt;branch&gt;</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 &lt;url&gt;</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 &lt;your_fork_url&gt;</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