0%

关于 Git,你需要知道的

Git 是一个分布式版本控制系统 (Distributed Version Control System, DVCS) ,它允许你追踪代码的每一次修改,并在团队协作中高效管理代码。

为什么选择 Git?

  • 分布式: 每个开发者本地都拥有完整的代码仓库历史,即使中央服务器出现问题,也能恢复数据。
  • 速度快: 大部分操作都在本地执行,速度非常快。
  • 强大的分支管理: 分支操作轻量、快速,使得特性开发、bug 修复等并行工作变得简单。
  • 数据完整性: 通过 SHA-1 哈希值保证每次提交的数据完整性。

Git 工作区域

  • 工作区 (Working Directory): 你在电脑上看到的文件目录,是你进行代码编辑的地方。
  • 暂存区 (Staging Area / Index): 一个轻量级的文件,它记录了你下次提交 (commit) 时会包含哪些文件的哪些改动。你可以将其理解为一个临时的存储区域,用于准备你的提交。
  • 本地仓库 (Local Repository): 存储了项目的所有版本历史。每次提交都会在这里生成一个版本快照。

Git 基本工作流程

  1. 工作区修改文件。
  2. 将修改过的文件添加到暂存区 (git add .git add <file>)。
  3. 将暂存区的改动提交到本地仓库 (git commit -m "commit message")。
  4. 将本地仓库的改动推送到远程仓库 (git push)。
  5. 从远程仓库拉取最新改动到本地 (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
2
3
4
5
<type>(<scope>): <subject>

<BLANK LINE>

<body>

提交时,可以用以下前缀表明提交的性质:

  • feat (feature): 新功能

  • fix (bug fix): 修复 Bug

  • docs (documentation): 文档变更

  • style (formatting, missing semicolons, etc.): 不影响代码逻辑的代码格式化

  • refactor (code refactoring): 代码重构,不引入新功能或修复 Bug

  • test (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