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 endpointfix(login): prevent infinite loop on failed logindocs(readme): update installation instructionsrefactor(utils): extract common helper function