Git 从入门到精通全攻略:100 + 核心命令 + 规范指南 + 实战技巧

Git版本控制

无论你是刚接触 Git 的新手,还是已经掌握了基本操作的开发者,这篇文章都能帮你系统掌握 Git 的命令体系,并学会写出专业的 commit 信息。从基础命令到高级合并策略,从混乱提交到规范协作,一文掌握 Git 精髓!

为什么需要掌握 Git?

在当今的软件开发世界中,Git 已经成为事实上的版本控制标准。它不仅能帮助你:

• 追踪代码变更历史,随时回退到任意版本
• 多人协作开发,避免代码冲突
• 分支管理,同时开发多个功能而不互相干扰
• 保障代码安全,防止意外丢失

但很多开发者只会基础的”三板斧”(add、commit、push),遇到复杂情况就束手无策。本文将系统梳理 Git 的命令体系和最佳实践,助你成为 Git 高手!

Git 命令大全

初始化类命令

命令 作用 使用场景
git init 初始化本地 Git 仓库 开始一个全新的项目
git clone <仓库地址> 克隆远程仓库到本地 参与已有项目开发

实用示例:

1
2
3
4
5
# 克隆GitHub上的项目
git clone https://github.com/username/project.git

# 克隆特定分支
git clone -b develop https://github.com/username/project.git

提交代码类命令

命令 作用 使用场景
git status 查看当前状态 了解哪些文件被修改
git add <文件> 添加到暂存区 准备提交特定文件
git add . 添加所有改动 准备提交所有变更
git commit -m “提交信息” 提交代码 记录一个完整的变更
git commit -am “提交信息” 跳过 add 直接提交 快速提交已跟踪文件
git log 查看提交记录 回顾项目历史
git diff 查看未暂存的改动 检查代码变更内容
git diff –cached 查看已暂存的改动 确认即将提交的内容

实用示例:

1
2
3
4
5
6
7
8
# 查看简洁的提交历史
git log --oneline --graph

# 查看特定文件的变更历史
git log -p filename.js

# 查看某人的提交记录
git log --author="张三"

远程仓库类命令

命令 作用 使用场景
git remote -v 查看远程仓库信息 确认远程连接状态
git remote add origin <地址> 关联远程仓库 连接本地与远程仓库
git push -u origin master 首次推送并关联 初始化远程分支关联
git push 推送代码到远程 分享你的代码变更
git pull 拉取并合并远程代码 获取团队最新代码
git fetch 仅拉取不自动合并 谨慎获取远程更新

实用示例:

1
2
3
4
5
# 强制推送(谨慎使用!)
git push -f origin master

# 拉取时使用rebase而非merge
git pull --rebase

分支管理类命令

命令 作用 使用场景
git branch 查看所有分支 了解分支情况
git branch <名字> 创建新分支 开始新功能开发
git checkout <分支名> 切换分支 在不同功能间切换
git checkout -b <名字> 创建并切换分支 快速开始新功能
git merge <分支名> 合并指定分支到当前分支 整合完成的功能
git branch -d <名字> 删除本地分支 清理已合并分支
git push origin –delete <名字> 删除远程分支 移除废弃的远程分支

实用示例:

1
2
3
4
5
6
# Git Flow工作流示例
git checkout -b feature/login # 创建功能分支
# ... 开发完成后 ...
git checkout develop # 切回开发主分支
git merge feature/login # 合并功能
git branch -d feature/login # 删除功能分支

回退与撤销类命令

命令 作用 使用场景
git reset –hard <版本号> 彻底回退版本 完全放弃某次提交后的所有更改
git reset –soft <版本号> 软回退保留改动 重新整理提交但保留代码改动
git reset HEAD <文件> 撤销暂存 将已 add 的文件移出暂存区
git checkout – <文件> 丢弃工作区修改 放弃对某文件的未提交改动
git revert 创建反向提交 安全地”撤销”已推送的提交

实用示例:

1
2
3
4
5
6
7
8
# 回退到上一个版本但保留改动
git reset --soft HEAD^

# 撤销最近一次提交但保留代码
git reset --soft HEAD~1

# 安全撤销已推送的提交
git revert a12b345

标签类命令

命令 作用 使用场景
git tag 查看所有标签 了解版本发布历史
git tag <名字> 创建标签 标记版本发布点
git tag -a v1.0 -m “版本说明” 创建带注释的标签 添加版本详细信息
git tag -d <名字> 删除标签 移除错误标签
git push origin <名字> 推送标签到远程 分享版本标记
git push origin –tags 推送所有标签 同步所有版本标记

清理类命令

命令 作用 使用场景
git clean -f 删除未跟踪文件 清理工作目录
git stash 暂存工作区修改 临时切换任务
git stash pop 恢复暂存的修改 继续之前的工作
git stash list 查看所有暂存 管理多个暂存
git gc 清理仓库空间 优化仓库性能

实用示例:

1
2
3
4
5
6
7
8
# 暂存工作区并添加说明
git stash save "正在开发登录功能"

# 应用特定的stash(不删除)
git stash apply stash@{1}

# 清理未跟踪的文件和目录
git clean -fd

Git 合并策略深入讲解

在团队协作中,如何合并代码是一个关键问题。不同的合并策略会直接影响代码历史的清晰度和团队协作的效率。

普通合并(git merge)

这是最安全也最常用的方式,适合团队协作。它会保留完整的历史轨迹,不改变原有提交。

1
2
git checkout main
git merge feature/login

特点:

• ✅ 创建一个新的”合并提交”(merge commit)
• ✅ 保留所有历史轨迹,清晰展示分支历史
• ⚠️ 可能会出现冲突,需要手动处理
• ⚠️ 历史记录可能看起来比较复杂

变基合并(git rebase)

变基是一种更优雅的合并方式,它会把一个分支的提交”平移”到另一个分支上,使历史看起来更加线性。

1
2
git checkout feature/login
git rebase main

特点:

• ✅ 历史记录更加干净、线性
• ✅ 避免了不必要的合并提交
• ⚠️ 本质上是改写历史,不要对已推送的公共分支使用
• ⚠️ 冲突解决可能更加复杂

快进合并(Fast-forward)

当目标分支是源分支的直接后代时,Git 可以执行”快进合并”,直接将分支指针前移。

1
git merge feature --ff-only

特点:

• ✅ 不会产生额外的合并提交
• ✅ 保持历史的线性
• ⚠️ 只适用于没有分叉的情况

压缩合并(git merge –squash)

压缩合并会将源分支的所有变更合并为一个新的提交,适合将”混乱”的开发历史整理成一个干净的功能提交。

1
2
3
git checkout main
git merge --squash feature/login
git commit -m "feat(login): 新增登录功能"

特点:

• ✅ 将多个提交压缩成一个,历史更整洁
• ✅ 适合将完整功能作为一个单元合并
• ⚠️ 丢失了详细的开发历史
• ⚠️ 不保留分支信息

交互式变基(git rebase -i)

交互式变基是一个强大的工具,允许你在合并前重写提交历史,如合并、拆分、重排或修改提交。

1
git rebase -i HEAD~5

这会打开一个编辑器,让你选择如何处理每个提交:

1
2
3
4
5
6
7
8
pick 123abc 登录接口
pick 456def 修复登录跳转
pick 789ghi 删除调试代码

# 改成这样
pick 123abc 登录接口
squash 456def 修复登录跳转
squash 789ghi 删除调试代码

特点:

• ✅ 完全控制历史记录的呈现方式
• ✅ 可以创建干净、有意义的提交历史
• ⚠️ 操作复杂,需要谨慎使用
• ⚠️ 不适合已推送到远程的提交

Git 提交规范(写出专业的 commit message)

在团队协作中,规范的提交信息至关重要。试想一下,如果你看到这样的提交历史:

1
2
3
4
fix bug
update
123
aaaaaaa

这不仅不利于版本回滚,也无法理解每次提交的内容和目的。

Angular 提交规范

目前最流行的提交规范是 Angular 团队的规范,基本格式如下:

1
2
3
4
5
<type>(<scope>): <subject>

<body>

<footer>

1. 类型(type)

feat: 新增/修改功能
fix: 修复 bug
docs: 文档更新
style: 代码格式调整,不影响功能
refactor: 重构代码,既不是新功能也不是修 bug
perf: 性能优化
test: 添加或修改测试代码
chore: 构建过程或辅助工具变动
revert: 回滚之前的提交
ci: 持续集成相关变更
build: 构建系统或外部依赖变更

2. 作用域(scope,可选)

表示本次提交影响的范围,如:

fix(auth): 修复登录验证失败问题
feat(user): 添加用户资料编辑功能

3. 简短描述(subject)

• 简明扼要描述本次提交的内容
• 使用现在时态,如”change”而非”changed”
• 首字母不要大写
• 结尾不加句号

完整提交示例

1
2
3
4
5
6
7
feat(profile): 新增用户头像上传功能

- 支持头像预览和裁剪
- 增加图片格式和大小验证
- 优化上传组件交互体验

Closes #123

使用工具自动规范

可以使用以下工具来强制执行提交规范:

• Commitizen: 引导式提交信息生成工具
• commitlint: 提交信息校验工具
• husky: Git 钩子工具,可以在提交前自动检查

Git 工作流模型

不同的团队可能采用不同的 Git 工作流模型,以下是几种常见的模型:

GitHub Flow

简单直接的工作流:

  1. 从 main 分支创建功能分支
  2. 开发并提交更改
  3. 创建 Pull Request
  4. 代码审查
  5. 合并到 main 并部署

Git Flow

更结构化的工作流,适合正式发布的产品:

• master: 只存放正式发布的版本
• develop: 日常开发分支
• feature/xxx: 新功能分支
• release/xxx: 发布准备分支
• hotfix/xxx: 紧急修复分支

Trunk Based Development

所有开发者直接在主干分支(trunk)上工作:

• 频繁集成小改动
• 使用功能开关控制未完成功能
• 适合 CI/CD 环境

常见问题与解决方案

1. 如何撤销已推送的提交?

1
2
3
4
5
# 使用revert创建一个新提交来撤销之前的提交
git revert <commit-id>

# 然后推送到远程
git push origin main

2. 如何解决合并冲突?

1
2
3
4
5
# 当遇到冲突时,Git会标记冲突文件
# 编辑冲突文件,寻找并解决冲突标记
# 解决后,添加文件并继续合并
git add <冲突文件>
git merge --continue # 或 git rebase --continue

3. 如何查看特定文件的历史?

1
2
3
4
5
# 查看文件的完整历史
git log --follow -p -- path/to/file

# 查看谁修改了文件的每一行(blame)
git blame path/to/file

4. 如何比较两个分支的差异?

1
2
3
4
5
# 查看两个分支的文件差异
git diff branch1..branch2

# 只查看哪些文件不同
git diff --name-only branch1..branch2

总结

Git 是一个强大而灵活的版本控制系统,掌握它需要时间和实践。记住以下关键点:

  1. 理解工作区、暂存区和仓库的概念和关系
  2. 养成规范的提交习惯,写清晰的提交信息
  3. 选择合适的分支策略,保持代码历史的清晰
  4. 熟练使用常用命令,提高工作效率
  5. 不断学习和实践,Git 的功能远不止本文所述

希望这篇文章能帮助你更好地使用 Git,如果你有任何问题或建议,欢迎在评论区留言讨论!

#git #版本控制 #编程技巧 #开发工具 #团队协作