Git 基础概念与核心特点

11 min入门

Git 的核心概念、分布式版本控制原理与基本工作流。

学习目标

本文是「Git」模块的第 1 篇,难度定位为入门。重点内容:Git 的核心概念、分布式版本控制原理与基本工作流。

主要章节:

    1. Git 概述
    1. Git 核心特点
    1. Git 基础概念
    1. Git 安装与配置
    1. 基本 Git 命令
    1. 常见工作流程
  • ……共 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 会跟踪这些变化。 工作区状态:

  • 未跟踪(Untracked):新创建的文件,Git 还没有开始跟踪
  • 已修改(Modified):已跟踪的文件被修改但尚未暂存
  • 已暂存(Staged):已修改的文件被添加到暂存区,准备提交

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:

  1. 访问 Git 官网 下载安装程序
  2. 运行安装程序,按照默认选项安装
  3. 安装完成后,打开 Git Bash 验证安装 macOS:
  4. 使用 Homebrew 安装:brew install git
  5. 或使用 Xcode 命令行工具:xcode-select --install Linux:
  6. Ubuntu/Debian:sudo apt install git
  7. CentOS/RHEL:sudo yum install git
  8. 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 集中式工作流

适用于小型团队,只有一个主分支,所有开发者直接在主分支上工作。 流程:

  1. 克隆远程仓库
  2. 在本地修改代码
  3. 提交修改
  4. 推送到远程仓库

7.2 功能分支工作流

每个功能都在独立的分支上开发,完成后合并到主分支。 流程:

  1. 从主分支创建功能分支
  2. 在功能分支上开发
  3. 提交修改
  4. 将功能分支合并到主分支
  5. 删除功能分支

7.3 GitFlow 工作流

更复杂的工作流,包含多个专用分支:

  • main:稳定的发布分支
  • develop:开发分支
  • feature/*:功能分支
  • release/*:发布准备分支
  • hotfix/*:紧急修复分支

7.4 Forking 工作流

适用于开源项目,开发者通过 fork 仓库进行贡献。 流程:

  1. Fork 远程仓库
  2. 克隆自己的 fork
  3. 创建功能分支
  4. 开发并提交修改
  5. 向原仓库提交 Pull Request

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 远程仓库管理

  • 使用 SSH 连接:更安全、更方便
  • 定期备份远程仓库:防止数据丢失
  • 设置分支保护:保护主分支不被直接推送
  • 使用标签管理版本:如 v1.0.0

9. 常见问题与解决方案

9.1 合并冲突

问题:合并分支时出现冲突 解决方案:

  1. 查看冲突文件:git status
  2. 手动编辑冲突文件,解决冲突
  3. 标记冲突已解决:git add <file>
  4. 完成合并:git commit

9.2 误提交敏感信息

问题:不小心提交了密码、API 密钥等敏感信息 解决方案:

  1. 立即修改敏感信息
  2. 使用 git filter-branch 或 BFG Repo-Cleaner 从历史中移除敏感信息
  3. 更新所有相关的密码和密钥

9.3 仓库过大

问题:仓库体积过大,影响克隆和操作速度 解决方案:

  1. 使用 git gc 清理垃圾文件
  2. 使用 Git LFS 管理大型文件
  3. 考虑使用浅克隆:git clone --depth 1 <url>

9.4 忘记推送提交

问题:在本地提交后忘记推送到远程仓库 解决方案:

  1. 查看本地提交:git log
  2. 推送提交:git push origin <branch>

9.5 错误删除分支

问题:不小心删除了包含重要代码的分支 解决方案:

  1. 查看最近的提交:git reflog
  2. 恢复分支:git branch <branch-name> <commit-hash>

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