Git 基础概念与命令速查
Git 是目前最流行的分布式版本控制系统。学习路径见 运维导读。它用于追踪文件的变化,支持多人协作开发。相比于集中式版本控制(如 SVN),Git 每个开发者本地都拥有完整的仓库历史,不依赖中央服务器就能进行提交、分支、合并等操作。
一、什么是 Git?
- 版本控制:记录文件或目录的修改历史,可以随时回退到任意版本,查看修改内容。
- 分布式:每个开发者的本地仓库都包含完整的版本历史(不止是最新代码),可以在没有网络的情况下工作,并最终与远程仓库同步。
- 快照,而非差异:Git 将每次提交视为一次完整的项目快照,并保存快照的引用,而不是基于文件的差异做增量。
二、Git 的核心区域
Git 管理文件的生命周期涉及四个主要区域:
| 区域 | 英文 | 说明 |
|---|---|---|
| 工作区 | Working Directory | 你在电脑上看到的实际文件目录,可以直接编辑、新增、删除文件。 |
| 暂存区 | Staging Area / Index | 一个临时存储区域。使用 git add 将工作区的修改放入暂存区,准备下一次提交。 |
| 本地仓库 | Local Repository | 使用 git commit 将暂存区的修改持久保存到本地 Git 仓库(.git 目录)。这里存储了完整的提交历史。 |
| 远程仓库 | Remote Repository | 托管在服务器(如 GitHub、GitLab、Gitee)上的共享仓库。通过 git push 将本地提交推送到远程分支,通过 git pull / git fetch 获取他人的更新。 |
工作流程图示:
工作区 → (git add) → 暂存区 → (git commit) → 本地仓库 → (git push) → 远程仓库
↑ ↓
(git checkout -- <file>) (git pull / fetch)
放弃工作区修改 更新本地
三、文件的三种状态
Git 中的文件可能处于以下三种状态之一:
| 状态 | 英文 | 描述 | 对应命令 |
|---|---|---|---|
| 已修改 | modified | 文件已被修改(在工作区中进行了编辑),但还没有被标记为要提交。 | 编辑文件后自动进入此状态 |
| 已暂存 | staged | 已将修改后的文件添加到暂存区,准备纳入下一次提交。 | git add |
| 已提交 | committed | 暂存区的修改已经安全地保存到本地仓库中,形成历史版本。 | git commit |
注意:已跟踪(tracked) 指的是上一次提交时已经存在的文件,或者已经执行过
git add的文件。未跟踪(untracked)是指新创建但从未被 Git 管理的文件(通常需要先git add)。
四、简单示例
# 新建文件并查看状态(此时为未跟踪)
echo "Hello" > README.md
git status # 显示未跟踪文件
# 添加到暂存区(变为已暂存)
git add README.md
# 提交到本地仓库(变为已提交)
git commit -m "add README"
# 修改工作区文件(变为已修改)
echo "World" >> README.md
git status # 显示已修改
# 再次添加到暂存区并提交
git add README.md
git commit -m "update README"
五、常用命令速查表
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看状态 | git status | 显示工作区和暂存区的状态(哪些文件被修改、未跟踪等) |
| 添加文件 | git add . | 将当前目录所有变化添加到暂存区(也可以指定具体文件) |
| 提交 | git commit -m "msg" | 将暂存区内容提交到本地仓库,并附上说明 |
| 拉取并合并 | git pull | 从远程仓库拉取最新提交并合并到当前分支(相当于 fetch + merge) |
| 推送 | git push | 将本地分支的提交推送到远程仓库(需设置上游分支) |
| 查看历史 | git log --oneline | 以简洁的一行形式显示提交历史(hash + 提交说明) |
| 创建分支 | git checkout -b feature | 创建并切换到新分支 feature(Git 2.23+ 也可用 git switch -c feature) |
| 合并分支 | git merge feature | 将 feature 分支合并到当前分支 |
| 查看差异 | git diff | 显示工作区与暂存区之间的差异(未暂存的改动) |
| 撤销工作区修改 | git checkout -- file | 丢弃工作区中对 file 的修改,还原到最近一次 git add 或 git commit 的状态 |
| 撤销暂存 | git reset HEAD file | 将 file 从暂存区撤回到工作区(保留修改内容),新版也可用 git restore --staged file |
| 撤销提交(软回退) | git reset --soft HEAD~1 | 撤销最近一次提交,修改保留在暂存区(可以重新编辑后再次提交) |
| 克隆仓库 | git clone <url> | 将远程仓库完整克隆到本地,自动创建 origin 远程别名和主分支跟踪 |
六、进阶命令速查(扩展)
除了以上最基础的命令,日常开发中还会频繁用到下面这些:
| 场景 | 命令 | 说明 |
|---|---|---|
| 临时保存改动 | git stash | 将工作区/暂存区的改动临时收起,切换分支处理紧急任务后再 git stash pop 恢复 |
| 查看 stash 列表 | git stash list | 列出所有暂存的改动 |
| 变基 | git rebase main | 将当前分支的提交重新应用到 main 最新提交之上,保持线性历史 |
| 摘取单个提交 | git cherry-pick <hash> | 将某个提交的改动应用到当前分支(不需要合并整个分支) |
| 图形化历史 | git log --oneline --graph --all | 以图形方式查看所有分支的提交走向 |
| 查找引入 bug 的提交 | git bisect start | 通过二分查找定位引入问题的提交 |
| 查看某行的最后修改人 | git blame <file> | 逐行显示文件的最后修改提交与作者 |
提示:
git add .添加当前目录所有变化(包括新建、修改、删除);git add -A添加整个工作区的变化。git pull默认会合并(merge),若希望保持线性历史可使用git pull --rebase。git checkout -- <file>和git reset操作不可逆,请谨慎使用,尤其在--hard模式下。
七、注意事项
- 提交前先用
git status/git diff确认改动范围,避免误提交无关文件。 - 命令别名(见 Git 安装与配置)可以极大提升效率,建议尽早配置。
- 具体的分支、远程协作、历史回退等操作,详见后续章节。
八、小结
- Git 是分布式版本控制系统,每个开发者都有完整的仓库副本。
- 文件变化在工作区、暂存区、本地仓库之间流动,最终通过远程仓库协作。
- 文件状态分为已修改、已暂存、已提交三种,理解这些是掌握 Git 的基础。
- 掌握本文的速查表后,可以进行日常的
add、commit、push、pull等操作;更复杂的场景可查阅后续章节。
参考文献
| 资料 | 说明 |
|---|---|
| Pro Git · 起步 | 官方书 |
| Git 文档 | 命令参考 |
| 运维导读 | 本目录路径 |
相关文章
Git 分支、远程协作与标签管理
涵盖分支的创建、切换、合并与删除,远程仓库的管理、推送与拉取,以及标签(Tag)的创建、查看、推送与删除,是团队协作的核心内容。
Git 查看历史、撤销回退与冲突解决
涵盖 git log / git diff 查看提交历史与差异,commit --amend / reset / revert 的撤销与回退方式对比,以及合并、拉取、变基时冲突的产生原因与解决步骤。
Git 安装、配置与仓库初始化
涵盖 Windows / macOS / Linux 下 Git 的安装方式、首次使用的全局配置(用户名、邮箱、别名等)、创建或克隆仓库的方式,以及 .gitignore 忽略规则的编写方法。
Git 基础工作流与协作场景
涵盖日常文件级操作(状态查看、暂存、提交、撤销、删除、重命名)与团队协作中的常见场景示例(个人提交、功能分支开发、同步主分支、误提交撤销等)。
运维与协作导读
本目录覆盖日常开发运维中的 Git 版本控制、Docker 容器化与 Nginx 服务网关,与 工程化 · Git、部署相关 等章节互补,提供完整的十阶段学习路径。
Git 配置
版本控制常用 .gitignore(忽略不需纳入仓库的文件)与 .gitattributes(统一换行、diff、合并策略等)。见 工程化概览。
Series
git
3 / 5