Git 指南

PointY Lv2

环境准备

Git 安装

访问 Git 官网 下载并安装。

配置个人信息

1
2
3
4
5
6
# <xxx> : 表示需要替换的内容
git config --global user.name <name>
git config --global user.email <email>

# 使用 config 指令查看所有配置
git config --list

配置 SSH Key

1
2
3
4
5
6
# 检查是否存在 SSH Key
cd ~/.ssh && ls
# 如果出现了 id_rsa.pub 那么直接跳过这一步

# 配置 SSH Key
ssh-keygen -t rsa -C <email>

添加 SSH Key 到 GitHub

1
2
3
# 打印 id_rsa.pub
cd ~/.ssh && cat id_rsa.pub
# GitHub 个人头像 --> Settings --> SSH and GPG keys --> New SSH key

测试连接

1
ssh -T git@github.com

Git 核心概念

四大工作区域

Git 工作流程图

  • 工作区(Working Directory):即我们的工程项目文件
  • 暂存区(Staging Area):只能通过 git GUIgit shell 窗口显示,提交代码、解决冲突的中转站
  • 本地仓库(Local Repository):只能在 git shell 窗口显示,连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处
  • 远程仓库(Remote Repository):保存在服务器上的仓库,例如 GitHub

基本工作流程

  flowchart LR
      A[工作区] -->|git add| B[暂存区]
      B -->|git commit| C[本地仓库]
      C -->|git push| D[远程仓库]
      D -->|git fetch| C
      C -->|git merge| A
      D -.->|git pull| A

基础操作

仓库初始化

从远程克隆

1
2
3
4
5
# GitHub 上进入项目首页,点击 Code,选择 SSH 方式(默认),复制项目地址
git clone <URL>

# 克隆指定分支
git clone -b <branch> <URL>

在本地创建仓库

1
2
3
4
5
6
# 本地仓库创建
git init

# 创建远程仓库后复制项目地址 URL
# 关联远程仓库
git remote add origin <URL>

文件管理

1
2
3
4
5
6
7
8
9
10
11
# 添加文件到暂存区
git add <file>

# 添加所有修改的文件
git add .

# 从版本控制中移除文件
git rm <file>

# 文件重命名
git mv <file> <newname>

查看状态与差异

1
2
3
4
5
6
7
8
9
10
11
# 查看当前状态
git status

# 显示工作区和暂存区之间的不同
git diff

# 显示暂存区和上一条提交之间的不同
git diff --staged

# 显示工作目录和上一条提交之间的不同
git diff HEAD

提交代码

1
2
3
4
5
6
# 提交到本地仓库(推荐方式)
git commit -m "提交说明"

# 提交所有已跟踪文件的修改
git commit -am "提交说明"

提交信息规范

  • feat: 新功能
  • fix: 修复 bug
  • docs: 文档更新
  • style: 代码格式调整
  • refactor: 重构
  • test: 测试相关
  • chore: 构建/工具变动

拉取与推送

1
2
3
4
5
6
7
8
# 下载远程代码并合并
git pull

# 推送到远程仓库
git push

# 首次推送并设置上游分支
git push -u origin <branch>

.gitignore 配置

创建 .gitignore 文件来忽略不需要版本控制的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# CMake 构建目录
build/*
cmake-build-*/**

# Visual Studio
.vs/
*.sln
*.suo
*.vcxproj
*.vcxproj.filters
*.vcxproj.user
Debug/*
Release/*
x64/*
Win32/*

# VS Code
.vscode/*
*.code-workspace

# CLion
.idea/*

查看历史记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看提交历史
git log

# 查看简洁的提交历史
git log --oneline --graph

# 查看每个 commit 的改动细节
git log -p

# 查看简要统计
git log --stat

# 查看指定 commit 的指定文件改动细节
git show <commit> <file>

# 查看某个文件的修改历史
git log -p <file>

# 图形化查看分支历史
git log --oneline --graph --all

标签管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建轻量标签
git tag v1.0.0

# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本 1.0.0"

# 查看所有标签
git tag

# 查看标签详情
git show v1.0.0

# 推送标签到远程
git push origin v1.0.0

# 推送所有标签
git push origin --tags

# 删除本地标签
git tag -d v1.0.0

# 删除远程标签
git push origin --delete v1.0.0

子模块管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加子模块
git submodule add <URL> <path>

# 克隆包含子模块的项目
git clone --recursive <URL>

# 初始化并更新子模块
git submodule init
git submodule update

# 更新所有子模块到最新版本
git submodule update --remote

# 查看子模块状态
git submodule status

分支管理

分支基础操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看所有分支
git branch

# 查看远程分支
git branch -r

# 创建新分支
git branch <branch-name>

# 切换分支
git checkout <branch-name>

# 创建并切换到新分支
git checkout -b <branch-name>

# 删除本地分支
git branch -d <branch-name>

# 强制删除本地分支
git branch -D <branch-name>

# 删除远程分支
git push origin --delete <branch-name>

分支合并

merge(推荐用于主分支合并)

1
2
3
4
5
6
7
8
# 切换到目标分支
git checkout main

# 合并指定分支到当前分支
git merge <branch-name>

# 禁用快进模式合并(保留分支历史)
git merge --no-ff <branch-name>

rebase(推荐用于功能分支整理)

1
2
3
4
5
# 将当前分支的提交应用到目标分支之上
git rebase <branch-name>

# 交互式 rebase(可以修改、合并、删除提交)
git rebase -i HEAD~3

SmartGit等GUI

例如:分支 dev 合并至 main

  1. 检出分支 dev、main(保留至本地)
  2. 保证本地 dev、本地 main 代码与远程分支是一致的
  3. 当前分支切换至 dev
  4. 选中 main 分支,右键选择合并

SmartGit 合并操作

合并选项

一般选择合并到工作区,检查验证完毕再提交。

常见冲突类型:

  • 重命名文件合并冲突:需要通过 git rm / git add 解决
  • 增删文件可选择:右键 -> 解决 -> 采用我们的/采用他们的

解决冲突

手动合并

分别克隆两个分支的代码,使用 Beyond Compare 比较并手动合并,再 commit、push。

该方法在 git 分支图上不会留下合并记录,且手动合并的代码被认为是你提交的(可能突然背锅)。不太建议。

解决冲突

当遇到冲突时,需要手动解决:

命令行方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看冲突文件
git status

# 编辑冲突文件,手动解决冲突标记
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 合并分支的内容
# >>>>>>> branch-name

# 标记冲突已解决
git add <file>

# 完成合并
git commit

合并策略对比

策略特点适用场景
merge保留完整历史,产生合并提交主分支合并,需要保留分支历史
merge --no-ff强制产生合并提交功能分支合并到主分支
rebase线性历史,无合并提交功能分支整理,保持历史清晰
squash压缩多个提交为一个清理琐碎提交

注意rebase 在 git 中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。

永远不要 rebase 已经推送到远程的提交!

撤销与修改

撤销工作区修改

1
2
3
4
5
# 撤销单个文件的修改
git checkout -- <file>

# 撤销所有修改(谨慎使用)
git checkout .

撤销暂存区

1
2
3
4
5
# 将文件从暂存区移除,但保留工作区修改
git reset HEAD <file>

# 撤销所有暂存
git reset HEAD

修改最后一次提交

1
2
3
4
5
6
# 修改提交信息
git commit --amend -m "新的提交信息"

# 添加遗漏的文件到上次提交
git add <forgotten-file>
git commit --amend --no-edit

撤销提交(reset)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# git reset [--soft | --mixed | --hard] [HEAD]

# 回退到上一个版本,保留工作区和暂存区
git reset --soft HEAD^

# 回退到上一个版本,保留工作区,清空暂存区(默认)
git reset HEAD^

# 回退到上一个版本,清空工作区和暂存区(危险操作)
git reset --hard HEAD^

# 回退指定文件到上一个版本
git reset HEAD^ <file>

# 回退到指定版本
git reset 052e

# 补充 HEAD 说明:
# ^ 符号
# - HEAD 表示当前版本
# - HEAD^ 上一个版本
# - HEAD^^ 上上个版本
# ~ 符号
# - HEAD~0 表示当前版本
# - HEAD~1 上一个版本
# - HEAD~3 前三个版本

合并提交(rebase)

1
2
3
4
5
6
7
8
9
# 合并最近两次提交
git rebase -i HEAD~2

# 交互式界面中的操作:
# pick - 保留该提交
# reword - 保留提交,但修改提交信息
# edit - 保留提交,但停下来修改
# squash - 合并到前一个提交
# drop - 删除该提交

暂存工作(stash)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 暂存当前修改
git stash

# 暂存时添加说明
git stash save "工作进行到一半"

# 查看暂存列表
git stash list

# 恢复最近的暂存并删除
git stash pop

# 恢复最近的暂存但不删除
git stash apply

# 恢复指定暂存
git stash apply stash@{0}

# 删除指定暂存
git stash drop stash@{0}

# 清空所有暂存
git stash clear

团队协作

多人协作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 克隆项目
git clone <URL>

# 2. 创建功能分支
git checkout -b feature/new-feature

# 3. 开发并提交
git add .
git commit -m "feat: add new feature"

# 4. 推送到远程
git push -u origin feature/new-feature

# 5. 在 GitHub 上创建 Pull Request

# 6. 代码审查通过后合并到主分支

# 7. 更新本地主分支
git checkout main
git pull

提交前先pull

预设场景:

  • 同事 A,同事 B
  • 初始远程仓库:版本 T

由于所有项目组成员都可以修改远程仓库的版本,很容易出现以下情况:

  • 同事 A、B 都 clone 了远程仓库版本 T,修改后的版本记录为 TA、TB
  • 假设同事 A 先提交,这时远程仓库变为 TA,同事 B 再提交代码时可能出现两个情况:
  1. Git 自动合并
  2. 需要手动解决冲突

提交代码前先从远程仓库同步代码,最后再推送至远程仓库!git pull --rebase

完整流程:

1
2
3
4
5
6
7
8

git add .
git commit -m "feat: your changes"
git pull --rebase
# 如果有冲突,解决后继续
git add .
git rebase --continue
git push

常见问题

推送被拒绝

1
2
3
4
# 原因:远程仓库有新的提交
# 解决:先拉取再推送
git pull --rebase
git push

当然,具体得看报错分析

误提交到错误分支

1
2
3
4
5
# 解决:将提交移动到正确分支
git log # 记下提交的 hash
git reset --hard HEAD^ # 撤销当前分支的提交
git checkout <correct-branch>
git cherry-pick <commit-hash>

需要撤销已推送的提交

1
2
3
4
5
6
7
# 方法一:使用 revert(推荐,不改变历史)
git revert <commit-hash>
git push

# 方法二:使用 reset(危险,会改变历史,仅在确认无人基于该提交工作时使用)
git reset --hard <commit-hash>
git push --force # 谨慎使用

提交后发现漏了文件

1
2
git add <forgotten-file>
git commit --amend --no-edit

修改已经提交的 commit

1
2
3
4
5
6
# 修改最后一次提交
git commit --amend -m "新的提交信息"

# 修改更早的提交
git rebase -i HEAD~3
# 将要修改的提交前的 pick 改为 reword

合并多个 commit?

1
2
git rebase -i HEAD~3
# 将要合并的提交前的 pick 改为 squash

查看两个分支的差异

1
git diff branch1..branch2

临时保存工作进度

1
2
3
git stash
# 做其他事情
git stash pop

找回删除的提交

1
2
3
4
5
# 查看所有操作记录
git reflog

# 恢复到指定提交
git reset --hard <commit-hash>

附录

常用命令速查表

命令说明
git init初始化仓库
git clone <url>克隆远程仓库
git status查看状态
git add <file>添加到暂存区
git commit -m "msg"提交
git push推送到远程
git pull拉取并合并
git branch查看分支
git checkout -b <branch>创建并切换分支
git merge <branch>合并分支
git log --oneline查看提交历史
git diff查看工作区差异
git reset HEAD^撤销上次提交
git stash暂存当前修改
git tag v1.0.0创建标签
git remote -v查看远程仓库

提交信息规范

详见上文:提交信息规范

在线学习网站

参考资料

深入讲解

  • 标题: Git 指南
  • 作者: PointY
  • 创建于 : 2026-05-22 23:08:00
  • 更新于 : 2026-07-16 15:49:29
  • 链接: https://siyuhong.github.io/2026/05/22/git-first/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论