Git 基础概念与核心特点
Git 的核心概念、分布式版本控制原理与基本工作流。
学习目标
本文是「Git」模块的第 1 篇,难度定位为入门。重点内容:Git 的核心概念、分布式版本控制原理与基本工作流。
主要章节:
-
- Git 概述
-
- Git 核心特点
-
- Git 基础概念
-
- Git 安装与配置
-
- 基本 Git 命令
-
- 常见工作流程
- ……共 22 个章节
2. Git 概述
Git 是一个分布式版本控制系统,用于跟踪文件的变化,协调多人之间的工作。它是由 Linux 创始人 Linus Torvalds 于 2005 年创建的,现在被广泛用于软件开发和其他需要版本控制的场景。 Git 的主要用途包括:
- 记录代码的历史变更
- 协作开发时管理不同版本
- 回滚到之前的版本
- 分支管理,实现并行开发
- 远程仓库同步,方便代码共享
- 代码审查和质量控制
- 发布管理和版本控制 Git 与其他版本控制系统(如 SVN、CVS)的主要区别在于它是分布式的,每个开发者都拥有完整的代码仓库,而不是依赖中央服务器。
3. Git 核心特点
| 特点 | 描述 | 优势 |
|---|---|---|
| 分布式 | 每个开发者都有完整的代码仓库,不依赖中央服务器 | 即使网络中断也能正常工作,支持离线开发 |
| 高效 | 处理大型项目时性能优异,采用压缩算法存储数据 | 快速处理大型代码库,节省存储空间 |
| 安全 | 使用 SHA-1 哈希算法确保数据完整性,防止数据损坏 | 确保代码历史的真实性和完整性 |
| 灵活 | 支持多种工作流程,适应不同团队的需求 | 可以根据团队规模和项目特点选择合适的工作流程 |
| 强大的分支系统 | 轻松创建和管理分支,支持并行开发 | 允许同时开发多个功能,隔离不同的开发任务 |
| 速度快 | 本地操作速度快,大部分操作不需要网络连接 | 提高开发效率,减少等待时间 |
| 可靠性高 | 数据存储采用冗余设计,确保数据安全 | 即使部分数据损坏也能恢复 |
| 开源 | 完全开源,拥有活跃的社区支持 | 持续改进,免费使用 |
4. Git 基础概念
4.1 仓库(Repository)
仓库是存储代码和历史记录的地方,分为本地仓库和远程仓库:
- 本地仓库:存储在本地计算机上的代码仓库,包含完整的历史记录
- 远程仓库:存储在服务器上的代码仓库,用于团队协作和代码共享 仓库创建方式:
# 初始化新仓库
git init
# 克隆远程仓库
git clone https://github.com/username/repository.git
4.2 工作区(Working Directory)
工作区是本地文件系统中实际的文件和目录,是开发者直接修改的地方。当你在工作区中修改文件时,Git 会跟踪这些变化。 工作区状态:
4.3 暂存区(Staging Area)
暂存区是临时保存修改的地方,位于 .git/index 文件中。它是工作区和版本库之间的桥梁,用于准备提交的内容。
暂存区的作用:
4.4 版本库(Repository)
版本库包含所有提交历史和对象的地方,位于 .git 目录中。它存储了项目的完整历史记录,包括所有的提交、分支和标签。
版本库的组成:
4.5 提交(Commit)
提交是对工作区和暂存区变更的快照,包含以下信息:
- 提交信息:描述本次修改的内容
- 作者信息:提交者的姓名和邮箱
- 日期:提交的时间
- 父提交:指向上一次提交的指针
- 树对象:包含文件的快照 提交示例:
# 提交暂存区的内容
git commit -m "Add new feature"
# 提交所有已修改的文件(跳过暂存区)
git commit -a -m "Fix bug"
# 修改上次提交的信息
git commit --amend -m "Updated commit message"
4.6 分支(Branch)
分支是指向特定提交的指针,允许开发者在独立的环境中开发新功能或修复 bug,而不影响主分支的稳定性。新仓库的默认分支由 init.defaultBranch 决定,现行约定为 main(旧版本默认 master)。
分支操作:
# 列出所有分支
git branch
# 创建新分支
git branch feature-branch
# 切换分支
git checkout feature-branch
# 创建并切换到新分支
git checkout -b feature-branch
# 删除分支
git branch -d feature-branch
4.7 合并(Merge)
合并是将一个分支的更改合并到另一个分支的过程。Git 会自动处理简单的合并,对于复杂的合并可能需要手动解决冲突。 合并类型:
- 快进合并(Fast-forward):当目标分支没有新提交时,直接移动指针
- 三方合并:当双方都有新提交时,创建新的合并提交
- 变基合并(Rebase):将一个分支的提交应用到另一个分支上 合并操作:
# 合并分支到当前分支
git merge feature-branch
# 变基合并
git rebase main
4.8 远程(Remote)
远程是指向远程仓库的引用,通常命名为 origin。它用于与远程仓库进行交互,如推送和拉取代码。
远程操作:
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/username/repository.git
# 推送代码到远程仓库
git push origin main
# 从远程仓库拉取代码
git pull origin main
# 克隆远程仓库
git clone https://github.com/username/repository.git
5. Git 安装与配置
5.1 安装 Git
Windows:
- 访问 Git 官网 下载安装程序
- 运行安装程序,按照默认选项安装
- 安装完成后,打开 Git Bash 验证安装 macOS:
- 使用 Homebrew 安装:
brew install git - 或使用 Xcode 命令行工具:
xcode-select --installLinux: - Ubuntu/Debian:
sudo apt install git - CentOS/RHEL:
sudo yum install git - Fedora:
sudo dnf install git
5.2 配置 Git
基本配置:
# 设置用户名
git config --global user.name "Your Name"
# 设置邮箱
git config --global user.email "your.email@example.com"
# 设置默认编辑器
git config --global core.editor "code --wait" # 使用 VS Code
# 设置差异比较工具
git config --global diff.tool vscode
git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
# 启用彩色输出
git config --global color.ui auto
# 设置默认分支名称
git config --global init.defaultBranch main
查看配置:
# 查看所有配置
git config --list
# 查看特定配置
git config user.name
6. 基本 Git 命令
6.1 仓库操作
| 命令 | 描述 | 示例 |
|---|---|---|
git init | 初始化新仓库 | git init my-project |
git clone | 克隆远程仓库 | git clone https://github.com/username/repo.git |
git remote | 管理远程仓库 | git remote add origin <url> |
6.2 暂存与提交
| 命令 | 描述 | 示例 |
|---|---|---|
git add | 添加文件到暂存区 | git add file.txt 或 git add . |
git commit | 提交暂存区的内容 | git commit -m "Commit message" |
git status | 查看工作区状态 | git status |
git diff | 查看文件修改内容 | git diff 或 git diff --staged |
6.3 分支管理
| 命令 | 描述 | 示例 |
|---|---|---|
git branch | 列出或创建分支 | git branch 或 git branch feature |
git checkout | 切换分支 | git checkout main 或 git checkout -b feature |
git merge | 合并分支 | git merge feature |
git branch -d | 删除分支 | git branch -d feature |
6.4 远程操作
| 命令 | 描述 | 示例 |
|---|---|---|
git push | 推送代码到远程仓库 | git push origin main |
git pull | 从远程仓库拉取代码 | git pull origin main |
git fetch | 从远程仓库获取更新 | git fetch origin |
git remote -v | 查看远程仓库信息 | git remote -v |
6.5 历史查看
| 命令 | 描述 | 示例 |
|---|---|---|
git log | 查看提交历史 | git log 或 git log --oneline |
git show | 查看特定提交的内容 | git show <commit-hash> |
git blame | 查看文件的每行修改历史 | git blame file.txt |
6.6 撤销操作
| 命令 | 描述 | 示例 |
|---|---|---|
git checkout -- | 撤销工作区的修改 | git checkout -- file.txt |
git reset HEAD | 从暂存区移除文件 | git reset HEAD file.txt |
git reset --hard | 回滚到指定提交 | git reset --hard <commit-hash> |
git revert | 创建新提交撤销之前的提交 | git revert <commit-hash> |
7. 常见工作流程
7.1 集中式工作流
适用于小型团队,只有一个主分支,所有开发者直接在主分支上工作。 流程:
- 克隆远程仓库
- 在本地修改代码
- 提交修改
- 推送到远程仓库
7.2 功能分支工作流
每个功能都在独立的分支上开发,完成后合并到主分支。 流程:
- 从主分支创建功能分支
- 在功能分支上开发
- 提交修改
- 将功能分支合并到主分支
- 删除功能分支
7.3 GitFlow 工作流
更复杂的工作流,包含多个专用分支:
main:稳定的发布分支develop:开发分支feature/*:功能分支release/*:发布准备分支hotfix/*:紧急修复分支
7.4 Forking 工作流
适用于开源项目,开发者通过 fork 仓库进行贡献。 流程:
8. 最佳实践
8.1 提交规范
- 提交信息要清晰:使用简洁明了的语言描述提交内容
- 提交粒度要适中:每个提交应该只包含一个逻辑更改
- 使用语义化提交信息:如
feat: add new feature、fix: resolve bug、docs: update documentation - 避免提交大型二进制文件:使用 Git LFS 管理大型文件
8.2 分支管理
- 主分支保持稳定:主分支应该始终可部署
- 功能分支命名规范:如
feature/feature-name、bugfix/bug-description - 定期合并主分支到功能分支:避免合并冲突
- 及时删除已合并的分支:保持仓库整洁
8.3 代码质量
- 使用 .gitignore 文件:忽略不需要版本控制的文件
- 定期进行代码审查:通过 Pull Request 进行代码审查
- 使用钩子(Hooks):在提交前运行测试和 lint 检查
- 保持代码历史清晰:避免不必要的合并和回滚
8.4 远程仓库管理
9. 常见问题与解决方案
9.1 合并冲突
问题:合并分支时出现冲突 解决方案:
- 查看冲突文件:
git status - 手动编辑冲突文件,解决冲突
- 标记冲突已解决:
git add <file> - 完成合并:
git commit
9.2 误提交敏感信息
问题:不小心提交了密码、API 密钥等敏感信息 解决方案:
- 立即修改敏感信息
- 使用
git filter-branch或 BFG Repo-Cleaner 从历史中移除敏感信息 - 更新所有相关的密码和密钥
9.3 仓库过大
问题:仓库体积过大,影响克隆和操作速度 解决方案:
- 使用
git gc清理垃圾文件 - 使用 Git LFS 管理大型文件
- 考虑使用浅克隆:
git clone --depth 1 <url>
9.4 忘记推送提交
问题:在本地提交后忘记推送到远程仓库 解决方案:
- 查看本地提交:
git log - 推送提交:
git push origin <branch>
9.5 错误删除分支
问题:不小心删除了包含重要代码的分支 解决方案:
10. 总结
Git 是一个强大的分布式版本控制系统,它的核心概念和特点使其成为现代软件开发中不可或缺的工具。通过理解 Git 的基础概念,掌握基本命令和工作流程,你可以更有效地管理代码,提高团队协作效率。 Git 的分布式架构、高效性能和强大的分支系统使其特别适合现代软件开发,尤其是在团队协作场景中。无论是小型项目还是大型开源项目,Git 都能提供可靠的版本控制解决方案。 掌握 Git 不仅是开发人员的基本技能,也是提高代码质量和团队协作效率的重要手段。通过不断实践和学习,你可以逐渐掌握 Git 的高级功能,成为版本控制的专家。
配置管理
基本写法:设置全局用户
git config --global user.name "<姓名>"
# 配置用户名
git config --global user.name "Alice"
git config --global user.email "alice@example.com"
基本写法:查看配置
git config --list
# 查看所有配置
git config --list
# 查看特定配置
git config user.name
基本写法:设置默认编辑器
git config --global core.editor "<命令>"
# 设置 VS Code 为默认编辑器
git config --global core.editor "code --wait"
基本写法:配置别名
git config --global alias.<别名> "<命令>"
# 设置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --graph"
暂存与恢复
基本写法:stash 暂存修改
git stash [push -m "<消息>"]
# 暂存当前修改
git stash
# 带消息暂存
git stash push -m "WIP: feature A"
基本写法:查看暂存列表
git stash list
# 列出所有暂存
git stash list
基本写法:恢复暂存
git stash pop [<索引>]
# 恢复最近暂存并删除
git stash pop
# 恢复指定暂存
git stash pop stash@{1}
基本写法:应用暂存不删除
git stash apply [<索引>]
# 应用最近暂存(保留暂存)
git stash apply
基本写法:清除暂存
git stash drop [<索引>]
# 删除最近暂存
git stash drop
# 删除所有暂存
git stash clear
提交修改
基本写法:修改最近提交
git commit --amend [-m "<消息>"]
# 修改最近提交的消息
git commit --amend -m "新消息"
# 将新改动加入最近提交
git add . && git commit --amend --no-edit
基本写法:交互式添加
git add -p
# 选择性添加改动块
git add -p
基本写法:空提交
git commit --allow-empty -m "<消息>"
# 创建空提交(触发 CI 等)
git commit --allow-empty -m "trigger deploy"
分支操作
基本写法:查看分支
git branch [-a] [-v]
# 查看本地分支
git branch
# 查看所有分支(含远程)
git branch -a
# 查看分支详细信息
git branch -vv
基本写法:重命名分支
git branch -m [<旧名>] <新名>
# 重命名当前分支
git branch -m new-name
# 重命名指定分支
git branch -m old-name new-name
基本写法:删除分支
git branch -d <分支名>
# 安全删除(已合并)
git branch -d feature
# 强制删除
git branch -D feature
基本写法:追踪远程分支
git branch -u <远程>/<分支>
# 设置上游分支
git branch -u origin/main
合并策略
基本写法:合并分支
git merge <分支> [--no-ff]
# 默认合并(可能 fast-forward)
git merge feature
# 强制创建合并提交
git merge --no-ff feature
基本写法:变基
git rebase <目标分支>
# 将当前分支变基到 main
git rebase main
基本写法:交互式变基
git rebase -i <提交>
# 压缩最近 3 次提交
git rebase -i HEAD~3
基本写法:中止变基
git rebase --abort
# 取消变基
git rebase --abort
基本写法:解决冲突后继续
git rebase --continue
# 解决冲突后继续变基
git add . && git rebase --continue
远程仓库
基本写法:添加远程
git remote add <名称> <URL>
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
基本写法:查看远程
git remote -v
# 查看所有远程
git remote -v
基本写法:修改远程 URL
git remote set-url <名称> <新URL>
# 修改远程地址
git remote set-url origin git@github.com:user/repo.git
基本写法:拉取与推送
git pull [<远程>] [<分支>]
# 拉取并合并
git pull origin main
# 推送
git push origin main
# 推送并设置上游
git push -u origin feature
基本写法:强制推送
git push --force-with-lease
# 安全的强制推送(推荐)
git push --force-with-lease
历史查看
基本写法:查看提交历史
git log [--oneline] [--graph] [-<数量>]
# 单行显示历史
git log --oneline
# 图形化显示
git log --oneline --graph --all
# 查看最近 10 条
git log -10
基本写法:查看文件历史
git log -p <文件>
# 查看文件的变更历史
git log -p src/main.py
基本写法:搜索提交
git log --grep="<关键词>"
# 按消息搜索提交
git log --grep="fix"
基本写法:查看作者提交
git log --author="<姓名>"
# 按作者过滤
git log --author="Alice"
撤销与回退
基本写法:撤销工作区修改
git checkout -- <文件>
# 丢弃工作区修改
git checkout -- file.txt
基本写法:取消暂存
git reset HEAD <文件>
# 取消已暂存的文件
git reset HEAD file.txt
基本写法:软回退
git reset --soft <提交>
# 回退提交,保留改动在暂存区
git reset --soft HEAD~1
基本写法:硬回退
git reset --hard <提交>
# 完全回退(慎用)
git reset --hard HEAD~1
基本写法:撤销提交
git revert <提交>
# 创建反向提交
git revert abc123
标签管理
基本写法:创建标签
git tag [-a] <标签名> [-m "<消息>"] [<提交>]
# 创建轻量标签
git tag v1.0
# 创建附注标签
git tag -a v1.0 -m "Release 1.0"
基本写法:推送标签
git push <远程> <标签>
# 推送单个标签
git push origin v1.0
# 推送所有标签
git push origin --tags
基本写法:删除标签
git tag -d <标签名>
# 删除本地标签
git tag -d v1.0
# 删除远程标签
git push origin --delete v1.0
二分查找
基本写法:git bisect
git bisect start
# 启动二分查找
git bisect start
git bisect bad # 标记当前为坏
git bisect good v1.0 # 标记 v1.0 为好
# 测试后标记
git bisect good # 或 bad
# 完成查找
git bisect reset
樱桃挑选
基本写法:cherry-pick
git cherry-pick <提交>
# 选择性合并某个提交
git cherry-pick abc123
子模块
基本写法:添加子模块
git submodule add <URL> [<路径>]
# 添加子模块
git submodule add https://github.com/user/lib.git libs/lib
基本写法:初始化子模块
git submodule update --init --recursive
# 克隆后初始化子模块
git submodule update --init --recursive
工作树
基本写法:添加工作树
git worktree add <路径> <分支>
# 创建新工作树
git worktree add ../feature-work feature
基本写法:列出工作树
git worktree list
# 查看所有工作树
git worktree list
基本写法:删除工作树
git worktree remove <路径>
# 删除工作树
git worktree remove ../feature-work