环境准备
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
|
测试连接
Git 核心概念
四大工作区域

- 工作区(Working Directory):即我们的工程项目文件
- 暂存区(Staging Area):只能通过
git GUI 或 git 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: 修复 bugdocs: 文档更新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
- 检出分支 dev、main(保留至本地)
- 保证本地 dev、本地 main 代码与远程分支是一致的
- 当前分支切换至 dev
- 选中 main 分支,右键选择合并


一般选择合并到工作区,检查验证完毕再提交。
常见冲突类型:
- 重命名文件合并冲突:需要通过
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 都 clone 了远程仓库版本 T,修改后的版本记录为 TA、TB
- 假设同事 A 先提交,这时远程仓库变为 TA,同事 B 再提交代码时可能出现两个情况:
- Git 自动合并
- 需要手动解决冲突
提交代码前先从远程仓库同步代码,最后再推送至远程仓库!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 | 查看远程仓库 |
提交信息规范
详见上文:提交信息规范
在线学习网站
参考资料
深入讲解