1. Git 的基本介绍与工作原理
Git 是目前最流行的分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,最初用于 Linux 内核的源码管理。与传统的集中式版本控制系统(如 SVN)不同,Git 的每个工作副本都拥有完整的仓库历史,这意味着即使在没有网络的情况下,你依然可以提交代码、查看历史记录,并在联网后同步到远程仓库。
理解 Git 的工作原理,需要先掌握三个核心区域的概念:
- 工作区(Working Directory):你当前正在编辑的文件所在的目录,是直接可见、可修改的区域。
- 暂存区(Staging Area / Index):一个临时保存区域,用于记录你准备在下一次提交中纳入版本管理的文件快照。
- 本地仓库(Local Repository) :Git 在项目根目录下
.git文件夹中保存的完整历史记录,包含所有提交、分支和标签信息。
一次完整的 Git 工作流程通常如下:
bash
# 1. 在工作区修改文件
vim index.html
2. 将修改添加到暂存区
git add index.html
3. 将暂存区内容提交到本地仓库
git commit -m "更新首页标题"
Git 通过 SHA-1 哈希算法为每次提交生成唯一的 40 位十六进制标识,确保历史记录的完整性和不可篡改性。每次提交都指向其父提交,从而形成一条可追溯的提交链,这也是 Git 分支切换和版本回退的基础。
2. 环境搭建与初始配置
在开始使用 Git 之前,需要先在本地完成安装和基础配置。不同操作系统的安装方式略有差异,下面分别说明。
2.1 安装 Git
Windows 用户:前往 Git 官网下载安装包,一路默认安装即可。安装完成后,在开始菜单中找到 Git Bash,打开后即可使用 Linux 风格的命令行。
macOS 用户 :如果已安装 Homebrew,可以直接执行 brew install git;也可以安装 Xcode Command Line Tools,系统会自带 Git。
Linux 用户 :以 Ubuntu 为例,执行 sudo apt install git 即可完成安装。
安装完成后,可以在终端中验证版本:
bash
git --version
2.2 初始配置
Git 的配置分为三个层级:系统级(--system)、用户级(--global)和仓库级(--local)。对于个人开发环境,通常只需要配置用户级信息即可。
bash
# 配置用户名和邮箱(提交记录中会显示)
git config --global user.name "你的名字"
git config --global user.email "your_email@example.com"
配置默认分支名为 main(Git 2.28 之后支持)
git config --global init.defaultBranch main
配置常用别名,提高操作效率
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm commit
查看当前所有配置
git config --list
建议同时配置 SSH 密钥,以便后续免密访问远程仓库(如 GitHub、Gitee)。生成密钥的命令如下:
bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
生成后,将 ~/.ssh/id_rsa.pub 文件中的公钥内容复制到代码托管平台的 SSH Keys 设置页面即可。
3. 常用命令详解
这一部分将围绕日常开发中最常用的 Git 命令展开,从仓库创建到分支合并,逐步讲解每个命令的用途和典型场景。
3.1 仓库创建与初始化
在项目目录中执行 git init 即可将当前目录初始化为 Git 仓库。初始化后,目录下会出现隐藏的 .git 文件夹,它承载了仓库的全部元数据。
bash
mkdir my-project
cd my-project
git init
如果希望从远程仓库复制已有项目,则使用 git clone:
bash
git clone https://github.com/username/repository.git
3.2 文件暂存与提交
文件修改后,需要先添加到暂存区,再提交到本地仓库。常用命令如下:
bash
# 添加单个文件到暂存区
git add index.html
添加所有修改和新增文件
git add .
查看当前工作区和暂存区状态
git status
查看具体修改内容
git diff
提交暂存区内容,并附带提交信息
git commit -m "添加首页导航栏"
对于已经跟踪的文件,可以使用 git commit -am 跳过暂存步骤直接提交(注意:该命令不会包含新创建的文件):
bash
git commit -am "修复登录页样式问题"
3.3 分支管理
分支是 Git 最强大的特性之一,它允许你在不影响主线的同时并行开发多个功能。常用分支命令如下:
bash
# 查看本地分支列表(当前分支前会显示 *)
git branch
查看所有分支(包含远程分支)
git branch -a
创建新分支
git branch feature-login
切换分支
git checkout feature-login
创建并切换分支(最常用)
git checkout -b feature-login
删除本地分支
git branch -d feature-login
合并指定分支到当前分支
git merge feature-login
在合并分支时,如果两个分支修改了同一文件的同一区域,Git 会提示冲突。此时需要手动编辑冲突文件,保留需要的代码,然后重新提交。冲突标记如下:
bash
<<<<<<< HEAD
当前分支的代码
=======
被合并分支的代码
>>>>>>> feature-login
解决冲突后,执行以下命令完成合并:
bash
git add .
git commit -m "解决登录页样式冲突"
3.4 查看历史与回退
bash
# 查看提交历史(单行模式)
git log --oneline
查看图形化提交历史
git log --graph --oneline --all
回退到上一个提交(保留工作区修改)
git reset --soft HEAD~1
回退到上一个提交(同时清空暂存区,保留工作区)
git reset HEAD~1
强制回退并丢弃工作区修改(谨慎使用)
git reset --hard HEAD~1
3.5 暂存与恢复工作现场
当你在一个分支上开发到一半,需要临时切换到其他分支处理紧急任务时,可以使用 git stash 将当前未提交的修改暂时保存起来,切换分支处理完后再恢复现场。
bash
# 暂存当前工作区和暂存区的修改
git stash
查看暂存列表
git stash list
恢复最近一次暂存并删除该暂存记录
git stash pop
恢复指定暂存但不删除记录
git stash apply stash@{0}
丢弃指定暂存
git stash drop stash@{0}
3.6 变基与精选提交
git rebase 可以将当前分支的提交重新应用到另一个分支之上,使提交历史保持线性、整洁;git cherry-pick 则可以把其他分支的某个提交复制到当前分支,适合挑选特定修复。
bash
# 将当前分支的提交变基到 main 之上
git rebase main
交互式变基,可合并、修改或调整提交顺序
git rebase -i HEAD~3
将指定提交复制到当前分支
git cherry-pick 3f2a1b9
中止变基操作
git rebase --abort
需要说明的是,rebase 会改写提交历史,因此只建议在尚未推送的本地分支上使用;对于已经推送到远程并被他人拉取的分支,应优先使用 merge 保持历史可追溯。
4. 远程仓库操作
远程仓库是团队协作的核心。通过远程仓库,开发者可以共享代码、同步进度,并基于 Pull Request 或 Merge Request 进行代码评审。
4.1 关联远程仓库
bash
# 添加远程仓库地址
git remote add origin https://github.com/username/repository.git
查看远程仓库列表
git remote -v
修改远程仓库地址
git remote set-url origin https://github.com/username/repository.git
4.2 拉取与推送
bash
# 将远程仓库最新代码拉取到本地并自动合并
git pull origin main
将本地提交推送到远程仓库
git push origin main
首次推送时设置上游分支,后续可直接使用 git push
git push -u origin main
拉取远程更新但不自动合并(需要手动 merge 或 rebase)
git fetch origin
在团队协作中,推荐遵循以下流程:先 git pull 同步最新代码,解决冲突后再 git push,避免覆盖他人的提交。
4.3 fetch 与 pull 的区别
很多初学者容易混淆 git fetch 和 git pull。简单来说,git pull 等价于 git fetch 加上 git merge:fetch 只把远程更新下载到本地,不会改动你的工作区;而 pull 会直接尝试合并,可能触发冲突。
bash
# 只下载远程更新,不合并
git fetch origin
查看远程分支与本地分支的差异
git log --oneline HEAD..origin/main
确认无误后再手动合并
git merge origin/main
在多人协作、代码变动频繁的项目中,建议先 fetch 查看差异,再决定是否合并,避免 pull 自动合并带来意料之外的冲突。
5. 实际应用场景与最佳实践
掌握基础命令后,更重要的是在实际项目中形成良好的使用习惯。以下是一些高频场景和推荐做法。
5.1 功能分支开发流程
推荐使用 Git Flow 或 GitHub Flow 等分支模型。以 GitHub Flow 为例:
- 从
main分支创建功能分支:git checkout -b feature-xxx。 - 在功能分支上完成开发,并频繁提交。
- 推送功能分支到远程,发起 Pull Request。
- 通过代码评审后合并到
main,并删除功能分支。
5.2 提交信息规范
建议使用 Conventional Commits 规范,让提交历史更易读:
bash
feat: 新增用户注册功能
fix: 修复登录页在移动端的显示问题
docs: 更新 README 使用说明
refactor: 重构订单查询模块
test: 补充单元测试用例
5.3 使用 .gitignore 忽略无关文件
在项目根目录创建 .gitignore 文件,避免将依赖目录、编译产物和本地配置提交到仓库:
bash
node_modules/
dist/
.env
*.log
.DS_Store
5.4 使用标签管理版本
bash
# 创建标签
git tag v1.0.0
创建带注释的标签
git tag -a v1.0.0 -m "发布 1.0.0 版本"
推送标签到远程
git push origin v1.0.0
6. 常见问题解决方案
在使用 Git 的过程中,难免会遇到各种问题。这里整理了几个高频问题及对应的解决办法。
6.1 提交信息写错了怎么办
bash
# 修改最近一次提交信息
git commit --amend -m "正确的提交信息"
6.2 误提交了不该提交的文件
bash
# 从暂存区移除文件(保留工作区文件)
git reset HEAD file.txt
从版本库移除文件(同时删除工作区文件)
git rm file.txt
6.3 误删了文件或代码
bash
# 从最近一次提交恢复文件
git checkout -- file.txt
查看历史版本中的文件内容
git show HEAD~1:file.txt
6.4 推送被拒绝(远程有本地没有的提交)
bash
# 先拉取并合并远程更新
git pull origin main
解决冲突后重新推送
git push origin main
6.5 如何撤销已经推送的提交
bash
# 生成一个反向提交(推荐,保留历史记录)
git revert HEAD
推送反向提交到远程
git push origin main
6.6 误删分支后如何找回
如果误删了尚未合并的分支,只要该分支上最近的提交还在 reflog 中,就可以找回。先查看操作日志找到对应的提交哈希,再基于它重建分支。
bash
# 查看所有分支和 HEAD 的历史操作记录
git reflog
基于找到的提交哈希重建分支
git branch feature-login 3f2a1b9
6.7 如何忽略已经跟踪的文件
如果某个文件已经被提交到仓库,再把它写进 .gitignore 并不会生效。需要先从版本库中移除跟踪,但保留本地文件,然后再提交。
bash
# 从版本库移除跟踪,但保留工作区文件
git rm --cached config.local.js
提交这次变更
git commit -m "停止跟踪 config.local.js"
之后再将 config.local.js 写入 .gitignore
7. 学习资源推荐与进阶路径
掌握 Git 需要理论与实践相结合。以下资源可以帮助你从入门走向进阶。
7.1 推荐学习资源
- 官方文档:Git 官方文档(git-scm.com)是最权威的参考资料,包含完整的命令手册和概念讲解。
- Pro Git 中文版:免费开源书籍,系统讲解 Git 原理与实战,适合通读。
- Learn Git Branching:交互式可视化学习网站,通过游戏方式理解分支操作。
- GitHub Docs:GitHub 官方帮助文档,涵盖协作流程、PR 和 Actions 等实践内容。
7.2 进阶学习路径
- 第一阶段(入门) :掌握
add、commit、branch、merge、pull、push等核心命令,能够独立管理个人项目。 - 第二阶段(进阶) :理解
rebase、cherry-pick、stash、reflog等高级命令,掌握冲突解决的多种策略。 - 第三阶段(协作):熟悉 Pull Request 流程、Code Review 规范、Git Flow 分支模型,能够在团队中高效协作。
- 第四阶段(工程化):学习 Git Hooks、Git LFS、子模块(Submodule)、CI/CD 集成等,将 Git 融入自动化研发流程。
Git 的学习曲线虽然略显陡峭,但一旦掌握核心思想,它将成为你日常开发中不可或缺的利器。建议在真实项目中多加练习,遇到问题多查阅官方文档,逐步建立起自己的 Git 使用体系。