Git 是一个分布式版本控制系统 (Distributed Version Control System, DVCS) ,它允许你追踪代码的每一次修改,并在团队协作中高效管理代码。
为什么选择 Git?
- 分布式: 每个开发者本地都拥有完整的代码仓库历史,即使中央服务器出现问题,也能恢复数据。
- 速度快: 大部分操作都在本地执行,速度非常快。
- 强大的分支管理: 分支操作轻量、快速,使得特性开发、bug 修复等并行工作变得简单。
- 数据完整性: 通过 SHA-1 哈希值保证每次提交的数据完整性。
Git 工作区域
- 工作区 (Working Directory): 你在电脑上看到的文件目录,是你进行代码编辑的地方。
- 暂存区 (Staging Area / Index): 一个轻量级的文件,它记录了你下次提交 (commit) 时会包含哪些文件的哪些改动。你可以将其理解为一个临时的存储区域,用于准备你的提交。
- 本地仓库 (Local Repository): 存储了项目的所有版本历史。每次提交都会在这里生成一个版本快照。
Git 基本工作流程
- 在工作区修改文件。
- 将修改过的文件添加到暂存区 (
git add .
或git add <file>
)。 - 将暂存区的改动提交到本地仓库 (
git commit -m "commit message"
)。 - 将本地仓库的改动推送到远程仓库 (
git push
)。 - 从远程仓库拉取最新改动到本地 (
git pull
)。
Git 常用命令
初始化与克隆
git init
: 在当前目录初始化一个新的 Git 仓库。git clone <repository_url>
: 克隆一个远程仓库到本地。
文件操作
git add <file>
/git add .
: 将工作区的修改添加到暂存区。.
表示添加所有修改。git status
: 查看工作区和暂存区的状态,哪些文件被修改、哪些已暂存。git diff
:git diff
: 查看工作区与暂存区的差异。git diff --cached
: 查看暂存区与本地仓库最新提交的差异。git diff <commit_id> <file>
: 查看某个文件在特定提交后的差异。
git rm <file>
: 从工作区和暂存区删除文件,并标记删除操作。git mv <old_name> <new_name>
: 移动或重命名文件,并标记重命名操作。
提交与历史
git commit -m "commit message"
: 将暂存区的改动提交到本地仓库。m
表示提交信息。git commit -am "commit message"
: 相当于git add .
和git commit -m "commit message"
的组合,但只适用于已经被 Git 跟踪的文件。git commit --amend
: 修改上一次提交。会合并当前暂存区的改动到上一次提交,并允许修改提交信息。谨慎使用,因为它会改变提交历史。git log
: 查看提交历史。git log --oneline
: 简洁显示历史。git log --graph --oneline --all
: 图形化显示所有分支的提交历史。git log -p
: 显示每个提交的详细差异。
git show <commit_id>
: 查看某个提交的详细信息和改动内容。
分支管理
git branch
: 列出所有本地分支。git branch <branch_name>
: 创建一个新分支。git checkout <branch_name>
: 切换到指定分支。git checkout -b <new_branch_name>
: 创建并切换到新分支。git merge <branch_name>
: 将指定分支的改动合并到当前分支。git branch -d <branch_name>
: 删除已合并的本地分支。git branch -D <branch_name>
: 强制删除本地分支(即使未合并)。git remote show origin
: 查看远程仓库的分支信息。git push origin --delete <branch_name>
: 删除远程分支。
远程仓库
git remote -v
: 查看已配置的远程仓库。git remote add origin <repository_url>
: 添加一个名为origin
的远程仓库。git pull [remote_name] [branch_name]
: 从远程仓库拉取最新改动到本地。git pull
相当于git fetch
+git merge
。git fetch
: 从远程仓库下载最新改动,但不合并到当前工作区。
git push [remote_name] [branch_name]
: 将本地仓库的改动推送到远程仓库。
撤销与回滚
git restore <file>
: 撤销工作区中文件的修改(恢复到暂存区或上次提交的状态)。git restore --staged <file>
: 撤销暂存区中文件的修改(将文件从暂存区移回工作区)。git reset <file>
: 旧版命令,功能类似git restore --staged <file>
。git reset --hard HEAD
: 丢弃工作区和暂存区的所有修改,危险操作! 恢复到最新提交的状态。git reset --soft <commit_id>
: 将 HEAD 指向指定提交,但保留工作区和暂存区的改动。git reset --mixed <commit_id>
(默认) : 将 HEAD 指向指定提交,并清空暂存区,但保留工作区的改动。git reset --hard <commit_id>
: 将 HEAD 指向指定提交,并丢弃工作区和暂存区的所有改动,回滚到指定提交的状态。危险操作,会丢失数据!git revert <commit_id>
: 创建一个新的提交来撤销指定提交的改动。这是一种安全的撤销方式,因为它不会修改历史,而是添加一个新的“反向提交”。常用于公共分支的回滚。
标签 (Tag)
用于标记版本历史中特定的、重要的时间点,版本发布标记: 这是标签最常见、最重要的用途。当你发布一个软件版本(比如 v1.0.0、v2.1 等)时,你可以在对应的提交上打一个标签。这样,无论后续有多少新的提交,这个标签始终指向这个特定的版本,方便你回溯、下载或部署,例如:git tag -a v1.0.0 -m "Release version 1.0.0"
git tag
: 列出所有标签。git tag <tag_name>
: 创建轻量标签。git tag -a <tag_name> -m "message"
: 创建附注标签(推荐,包含更多信息)。git push origin --tags
: 推送所有标签到远程。git tag -d <tag_name>
: 删除本地标签。git push origin :refs/tags/<tag_name>
: 删除远程标签。
Git 高级概念与协作模式
Rebase (变基)
git rebase <base_branch>
: 将当前分支的提交“移植”到base_branch
的最新提交之后。- 作用: 使提交历史更线性、更整洁,避免了合并提交时产生的额外合并点。
- 注意事项: 不要对已经推送到远程的公共分支进行 Rebase,因为它会改变提交历史,导致其他协作者的工作出现问题。Rebase 适用于本地私人分支的清理。
Git Flow 工作流
一种流行的 Git 分支管理模型,定义了不同的分支角色和生命周期,包括:
master
/main
: 生产环境稳定代码。develop
: 最新开发代码,包含所有已完成的特性。feature/*
: 特性开发分支。release/*
: 发布准备分支。hotfix/*
: 紧急 bug 修复分支。
GitHub Flow / GitLab Flow
更简单、更轻量的工作流,通常围绕一个长期存在的 main
分支进行:
- 所有开发都在特性分支 (feature branch) 上进行。
- 特性分支开发完成后,通过拉取请求 (Pull Request / Merge Request) 审查后合并到
main
分支。 main
分支保持随时可部署状态。
Git Hooks
Git Hooks 是在 Git 命令(如 commit
, push
, receive
)执行前或执行后自动运行的脚本。
- 作用: 自动化任务,如代码风格检查 (
pre-commit
)、运行测试 (pre-push
)、部署 (post-receive
)。
提交命令规范
一个标准的 Git 提交信息通常包含三个部分:主题行、空行、正文。
1 | <type>(<scope>): <subject> |
提交时,可以用以下前缀表明提交的性质:
feat
(feature): 新功能fix
(bug fix): 修复 Bugdocs
(documentation): 文档变更style
(formatting, missing semicolons, etc.): 不影响代码逻辑的代码格式化refactor
(code refactoring): 代码重构,不引入新功能或修复 Bugtest
(adding missing tests, refactoring tests): 添加或修改测试chore
(build process or auxiliary tools and libraries such as documentation generation): 构建过程或辅助工具的变动,不涉及业务代码perf
(performance): 性能优化ci
(continuous integration): CI 配置相关变更build
(build system or external dependencies): 构建系统或外部依赖变更revert
(revert a previous commit): 回滚之前的提交范围 (Scope) (可选):指明本次变更影响的范围,例如
(login)
、(user-profile)
、(API)
、(docs)
等。这有助于更精确定位变更。
示例:
feat(auth): add user registration endpoint
fix(login): prevent infinite loop on failed login
docs(readme): update installation instructions
refactor(utils): extract common helper function