Git 基础教程
Tips
本教程基于Git 2.30及以上版本,适用于Windows、macOS和Linux平台。适合Git初学者,无需任何版本控制系统经验。
1. Git简介
Git是目前世界上最流行的分布式版本控制系统,由Linux之父Linus Torvalds于2005年创建。它专为快速、高效地处理从小型到超大型项目的所有事务而设计。
1.1 什么是版本控制系统
版本控制系统(VCS)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它允许你:
- 追踪文件的历史变更
- 查看文件的修改记录
- 恢复到之前的版本
- 多人协作开发
- 管理不同版本的代码
1.2 Git的特点
与其他版本控制系统相比,Git具有以下特点:
- 分布式:每个开发者都拥有完整的代码库副本
- 高性能:本地操作,快速高效
- 数据完整性:使用SHA-1哈希算法确保数据完整性
- 分支管理:强大的分支模型,轻量级分支
- 灵活的工作流:支持多种工作流模式
- 开源免费:自由使用和修改
- 广泛采用:被绝大多数开源和商业项目采用
1.3 Git与其他版本控制系统的区别
与传统的集中式版本控制系统(如SVN)相比:
特性 | Git (分布式) | SVN (集中式) |
---|---|---|
存储方式 | 完整仓库镜像 | 单一中央服务器 |
离线工作 | 完全支持 | 有限支持 |
分支管理 | 轻量、快速 | 重量级、慢 |
历史记录 | 完整存储在本地 | 存储在服务器 |
提交操作 | 本地提交,远程推送 | 直接提交到服务器 |
学习曲线 | 较陡峭 | 相对平缓 |
存储效率 | 快照存储,高效 | 差异存储 |
2. 安装与配置
2.1 在不同操作系统上安装Git
Windows安装:
- 从Git官网下载安装程序
- 运行安装程序,按照向导操作
- 推荐选择默认选项,但在选择默认编辑器时可以选择你熟悉的编辑器
- 安装完成后,可以使用Git Bash或命令提示符/PowerShell运行Git命令
macOS安装:
- 方法一:通过homebrew安装
brew install git
- 方法二:从Git官网下载安装程序
- 方法三:安装Xcode命令行工具,其中包含Git
xcode-select --install
Linux安装:
Ubuntu/Debian:
sudo apt update
sudo apt install git
CentOS/RHEL:
sudo yum install git
2.2 初次运行Git前的配置
安装Git后,需要进行一些基本配置:
设置用户名和邮箱(全局配置):
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
设置默认编辑器:
# 例如,设置为VS Code
git config --global core.editor "code --wait"
# 或设置为Vim
git config --global core.editor "vim"
配置行尾设置(在Windows上很重要):
# 自动转换行尾
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # macOS/Linux
查看所有配置:
git config --list
配置别名(可选但推荐):
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
2.3 Git配置文件位置
Git配置存储在三个不同的位置:
- 系统级配置:
/etc/gitconfig
- 用户级配置:
~/.gitconfig
或~/.config/git/config
- 仓库级配置:位于仓库中的
.git/config
配置的优先级:仓库级 > 用户级 > 系统级
3. Git基本概念
3.1 Git的三个区域
Git将文件管理分为三个区域:
- 工作区(Working Directory):实际的文件目录,你直接编辑的地方
- 暂存区(Staging Area/Index):临时存储你的改动,等待提交
- 仓库(Repository):永久存储提交的历史记录
3.2 Git的文件状态
Git中的文件有四种主要状态:
- 未跟踪(Untracked):Git不知道的新文件
- 已跟踪(Tracked):Git已知道的文件,分为三种子状态:
- 未修改(Unmodified):与上次提交相比没有变化
- 已修改(Modified):与上次提交相比有变化
- 已暂存(Staged):已将修改标记为下次提交的一部分
3.3 Git对象模型
Git的内部是一个内容寻址文件系统,使用四种主要对象:
- 数据对象(blob):存储文件内容
- 树(tree):存储目录结构和文件名
- 提交(commit):指向树,包含作者、提交者、提交信息等元数据
- 标签(tag):指向特定提交的指针
每个对象都有一个SHA-1哈希值,用作其唯一标识符。
4. 基本Git操作
4.1 创建仓库
初始化新仓库:
# 在当前目录创建一个空仓库
git init
克隆现有仓库:
# 从远程服务器克隆仓库
git clone https://github.com/username/repository.git
# 克隆并指定本地目录名
git clone https://github.com/username/repository.git myproject
4.2 保存修改
检查状态:
# 查看文件状态
git status
# 查看简洁状态
git status -s
添加文件到暂存区:
# 添加单个文件
git add filename.txt
# 添加多个文件
git add file1.txt file2.txt
# 添加所有修改过的文件
git add .
# 添加特定类型的文件
git add *.txt
提交修改:
# 提交暂存的修改
git commit -m "提交说明信息"
# 跳过暂存区,直接提交所有已跟踪文件的修改
git commit -a -m "提交说明信息"
查看差异:
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最后一次提交的差异
git diff --staged
# 查看两次提交之间的差异
git diff commit1 commit2
4.3 撤销与恢复
撤销工作区修改:
# 撤销对单个文件的修改
git checkout -- filename.txt
# Git 2.23+的新命令
git restore filename.txt
取消暂存:
# 取消已暂存文件
git reset HEAD filename.txt
# Git 2.23+的新命令
git restore --staged filename.txt
修改最后一次提交:
# 修改最后一次提交信息
git commit --amend -m "新的提交信息"
# 在不修改提交信息的情况下添加遗漏的文件
git add forgotten_file.txt
git commit --amend --no-edit
回退到之前的提交:
# 软重置(保留修改但取消提交)
git reset --soft HEAD~1
# 混合重置(默认模式,保留修改但取消提交和暂存)
git reset HEAD~1
# 或
git reset --mixed HEAD~1
# 硬重置(完全丢弃修改)
git reset --hard HEAD~1
4.4 查看历史
查看提交历史:
# 查看完整历史
git log
# 查看简化历史(每次提交一行)
git log --oneline
# 查看图形化历史
git log --graph --oneline --all
# 查看特定文件的历史
git log --follow filename.txt
# 查看特定作者的提交
git log --author="名字"
# 按日期范围查看
git log --since="2023-01-01" --until="2023-12-31"
查看文件内容:
# 查看指定提交中的文件内容
git show commit:filename.txt
# 查看工作区中的文件内容
cat filename.txt
4.5 忽略文件
Git可以通过.gitignore
文件忽略不需要跟踪的文件:
创建.gitignore文件:
touch .gitignore
常见的.gitignore规则:
# 忽略所有.log文件
*.log
# 不忽略特定的.log文件
!important.log
# 忽略build目录中的所有内容
build/
# 忽略特定文件
config.ini
查看忽略的文件:
git status --ignored
5. 分支管理
5.1 分支基础
查看分支:
# 列出本地分支
git branch
# 列出远程分支
git branch -r
# 列出所有分支(本地和远程)
git branch -a
# 查看每个分支的最后一次提交
git branch -v
创建分支:
# 创建新分支(但不切换)
git branch new-branch
# 创建并切换到新分支
git checkout -b new-branch
# Git 2.23+的新命令
git switch -c new-branch
切换分支:
# 切换到现有分支
git checkout branch-name
# Git 2.23+的新命令
git switch branch-name
删除分支:
# 删除已合并的分支
git branch -d branch-name
# 强制删除未合并的分支
git branch -D branch-name
5.2 合并分支
合并分支:
# 先切换到目标分支
git checkout main
# 合并指定分支到当前分支
git merge feature-branch
# 使用非快进方式合并(始终创建合并提交)
git merge --no-ff feature-branch
解决合并冲突: 当合并时发生冲突,需要手动解决:
- 查看冲突文件:
git status
- 编辑冲突文件,寻找
<<<<<<<
、=======
、>>>>>>>
标记 - 修改文件内容以解决冲突
- 添加解决后的文件:
git add filename.txt
- 完成合并:
git commit
5.3 变基操作
变基(rebase)是另一种合并分支的方式,它会重写提交历史:
# 在feature分支上变基到main
git checkout feature
git rebase main
# 如果有冲突,解决后继续
git add .
git rebase --continue
# 放弃变基
git rebase --abort
交互式变基:
# 修改最近的3个提交
git rebase -i HEAD~3
5.4 远程分支
查看远程仓库:
# 列出远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/username/repo.git
# 重命名远程仓库
git remote rename origin upstream
# 删除远程仓库引用
git remote remove upstream
推送到远程:
# 推送到远程分支
git push origin branch-name
# 设置上游分支并推送
git push -u origin branch-name
# 强制推送(谨慎使用)
git push --force origin branch-name
拉取远程更新:
# 获取远程更新但不合并
git fetch origin
# 获取并合并(相当于fetch+merge)
git pull origin branch-name
# 使用变基而不是合并
git pull --rebase origin branch-name
6. 高级Git功能
6.1 暂存工作
当需要临时切换到其他分支但又不想提交当前工作时:
# 保存当前工作
git stash
# 保存并添加描述
git stash save "暂存修改的描述"
# 查看暂存列表
git stash list
# 应用最近的暂存(但不删除)
git stash apply
# 应用并删除最近的暂存
git stash pop
# 应用特定的暂存
git stash apply stash@{2}
# 删除特定暂存
git stash drop stash@{1}
# 清除所有暂存
git stash clear
6.2 标签管理
Git可以给特定的提交创建标签,通常用于标记版本发布:
# 列出所有标签
git tag
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本1.0.0发布"
# 为特定提交创建标签
git tag -a v0.9.0 -m "Beta版本" 9fceb02
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0
6.3 查找问题
使用bisect二分查找:
当你想找出哪个提交引入了bug时,可以使用二分查找:
# 开始二分查找
git bisect start
# 标记当前版本有问题
git bisect bad
# 标记一个已知好的版本
git bisect good v1.0.0
# Git会检出中间的提交,测试后标记
git bisect good # 或 git bisect bad
# 重复上述步骤直到找到问题提交
# 结束查找
git bisect reset
使用blame查看每行的最后修改:
# 查看文件每行的最后修改者
git blame filename.txt
# 只查看特定行
git blame -L 10,20 filename.txt
6.4 子模块
子模块允许你将一个Git仓库作为另一个Git仓库的子目录:
# 添加子模块
git submodule add https://github.com/username/library.git lib
# 初始化子模块(克隆仓库后)
git submodule init
# 更新子模块
git submodule update
# 克隆包括子模块的仓库
git clone --recurse-submodules https://github.com/username/project.git
# 更新所有子模块
git submodule update --remote
7. Git工作流
7.1 集中式工作流
最简单的工作流,类似于SVN:
- 所有开发者使用同一个主分支(通常是main)
- 直接在主分支上开发,不使用功能分支
- 适合小型团队和简单项目
7.2 功能分支工作流
每个新功能都在专门的分支上开发:
- 从主分支创建功能分支
- 在功能分支上开发
- 完成后,合并回主分支
- 删除功能分支
7.3 Git Flow工作流
一个更结构化的分支模型:
- 使用两个长期分支:
main
/master
:生产环境代码develop
:开发环境代码
- 三种临时分支:
feature/*
:新功能开发release/*
:版本发布准备hotfix/*
:生产环境紧急修复
7.4 Forking工作流
常用于开源项目:
- 开发者fork主仓库
- 在自己的fork中开发
- 通过Pull Request贡献回主仓库
- 项目维护者审查并合并更改
8. 最佳实践
8.1 提交规范
原子提交:
- 每个提交应该只做一件事
- 不要将无关的更改混在一起
提交信息规范:
<类型>(<范围>): <简短描述>
<详细描述>
<相关issue>
类型示例:
feat
: 新功能fix
: 修复bugdocs
: 文档更改style
: 代码风格更改(不影响代码运行)refactor
: 重构test
: 添加或修改测试chore
: 构建过程或辅助工具的变动
8.2 保持提交历史干净
谨慎使用force push:
- 不要在公共分支上使用force push
- 使用
--force-with-lease
代替--force
使用交互式变基整理提交:
- 合并相关提交
- 拆分大型提交
- 修正提交信息
8.3 分支管理策略
分支命名规范:
- 功能分支:
feature/描述
- 修复分支:
bugfix/描述
或fix/描述
- 热修复分支:
hotfix/描述
- 发布分支:
release/版本号
定期同步分支:
- 经常从主分支拉取更新
- 解决合并冲突越早越好
9. Git图形化工具
9.1 内置GUI
Git自带简单的图形界面:
# 启动gitk查看历史
gitk
# 启动git gui进行提交
git gui
9.2 独立GUI工具
跨平台工具:
- GitKraken: 功能强大,界面美观
- Sourcetree: Atlassian开发的免费客户端
- GitHub Desktop: 简单易用,与GitHub集成
Windows特有:
- TortoiseGit: 资源管理器集成
macOS特有:
- Tower: 专业Git客户端
- Fork: 快速、友好的客户端
Linux特有:
- Git Cola: 轻量级界面
- Gitg: GNOME桌面集成
9.3 IDE集成
大多数现代IDE都内置了Git支持:
- VS Code: Git集成和扩展
- JetBrains IDEs (IntelliJ IDEA, PyCharm等): 强大的Git工具
- Eclipse: 通过EGit插件
- Visual Studio: 内置Git支持
10. 常见问题与解决方案
10.1 提交错误修复
修改最后一次提交:
git commit --amend
回退多个提交:
git reset --hard HEAD~3 # 回退3个提交
撤销公共提交:
git revert HEAD # 撤销最新提交
git revert a1b2c3 # 撤销特定提交
10.2 解决特殊冲突
二进制文件冲突:
# 使用ours策略
git checkout --ours -- path/to/file.bin
git add path/to/file.bin
# 使用theirs策略
git checkout --theirs -- path/to/file.bin
git add path/to/file.bin
特定工具解决冲突:
git mergetool
10.3 大文件处理
移除大文件:
git filter-branch --force --tree-filter 'rm -f path/to/large/file' HEAD
使用Git LFS:
# 安装Git LFS
git lfs install
# 跟踪大文件
git lfs track "*.psd"
# 确保.gitattributes被提交
git add .gitattributes
10.4 性能问题
提高大型仓库性能:
# 清理和优化本地仓库
git gc
# 更全面的优化
git gc --aggressive
# 检查占用空间
git count-objects -v
总结
Git是一个强大而灵活的版本控制系统,掌握它的基本概念和操作对于现代软件开发至关重要。通过本教程,你已经了解了Git的核心概念、基本命令、分支管理和工作流模式。随着实践的深入,你将能够利用Git更高级的功能来提高工作效率和代码质量。
记住,Git最强大的功能之一是它的灵活性——没有一种"正确"的使用方式,而是要根据项目需求和团队习惯选择合适的工作流程。最重要的是保持一致性,制定团队规范,并持续改进你的Git使用技巧。
如有问题或建议,欢迎联系作者: 1412800823@qq.com