本文将带你从零开始,全面了解 Git 的使用,涵盖基础命令、分支管理、远程操作、高级技巧、最佳实践,并重点补充Git Hooks 自动化脚本等企业级内容。(指令在最下方)

一、Git 基础概念

1. 什么是 Git? 

Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,用于高效管理项目代码的变更历史。每个开发者都拥有完整的代码仓库副本,包括所有历史记录。

2. 核心概念
  • 仓库 (Repository):存放项目代码和版本历史的目录。
  • 工作区 (Working Directory):你正在编辑的文件所在的目录。
  • 暂存区 (Staging Area / Index):临时存放即将提交的更改。
  • 本地仓库 (Local Repository):存储在你计算机上的 Git 仓库。
  • 远程仓库 (Remote Repository):托管在服务器(如 GitHub、GitLab)上的仓库。

二、Git 安装与配置

1. 安装 Git
  • Windows:下载 Git for Windows 并安装。
  • macOS:使用 Homebrew brew install git 或下载安装包。
  • Linux:使用包管理器,如 sudo apt install git(Ubuntu)。
2. 初始配置

安装完成后,设置你的用户名和邮箱(用于标识提交者):

# 设置用户信息(全局)
git config --global user.name "你的git 名称(name)"
git config --global user.email "你的邮箱"
 
# 设置默认编辑器(可选)
git config --global core.editor "vim"
 
# 启用彩色输出
git config --global color.ui true

提示--global 表示全局配置,对所有仓库生效。若只对当前项目配置,去掉 --global


    三、分支管理策略

    分支是 Git 的核心,合理的分支策略是团队协作的基础。

    1. Git Flow(经典模型)

    适用于有明确发布周期的项目。 

    • main / master:生产环境代码,保护分支,仅通过合并请求更新。
    • develop:集成分支,包含所有已完成的功能。
    • *feature/ **:功能分支,从 develop 创建,开发完成后合并回 develop
    • *release/ **:发布准备分支,用于测试和修复,完成后合并到 main 和 develop
    • *hotfix/ **:紧急修复分支,从 main 创建,修复后合并到 main 和 develop
    2. GitHub Flow(简化模型)

    适用于持续交付的项目(如 Web 应用)。

    • main:始终可部署的状态。
    • feature branches:任何新功能或修复都在独立分支开发。
    • Pull Request (PR):通过 PR 提交代码审查,审查通过后合并到 main
    • 立即部署:合并后自动部署到生产环境。
    3. GitLab Flow(环境驱动)

    结合环境分支(如 productionstaging)。

    • 基于 GitHub Flow,增加环境分支。
    • 功能分支合并到 main,通过 CI/CD 管道自动部署到不同环境。

    选择建议:初创团队推荐 GitHub Flow,大型项目或传统发布周期推荐 Git Flow


    四、Git Hooks 自动化脚本

    Git Hooks 是在特定 Git 事件(如提交、推送)发生时自动执行的脚本,用于自动化检查和流程。

    1. 钩子类型
    • 客户端钩子:在本地执行。
      • pre-commit:提交前运行(如代码格式化、单元测试)。
      • pre-push:推送前运行(如集成测试)。
      • post-commit:提交后运行。
    • 服务端钩子:在远程仓库执行(如 GitLab/GitHub 的 Webhooks)。
    2. 使用方法(以 pre-commit 为例)
    1. 进入钩子目录
      cd .git/hooks
    2. 创建脚本
      #!/bin/sh
      echo "Running pre-commit checks..."
       
      # 检查代码格式(示例:使用 prettier)
      # npx prettier --check .
       
      # 运行单元测试
      # npm test
       
      # 如果检查失败,退出非零状态,阻止提交
      # if [ $? -ne 0 ]; then
      #   echo "Tests failed. Commit aborted."
      #   exit 1
      # fi
       
      exit 0
    3. 赋予执行权限
      chmod +x pre-commit
    3. 推荐工具
    • pre-commit:一个框架,简化多语言钩子管理。
    • Husky:Node.js 项目常用的 Hooks 管理工具,通过 package.json 配置。

    企业实践:在 pre-commit 中集成代码格式化(Prettier)、静态检查(ESLint、Checkstyle),在 pre-push 中运行关键测试,确保提交质量。

    五、最佳实践

    1. 小步提交:每次提交只做一件事,信息清晰。
    2. 写好提交信息:使用 feat:fix:docs:chore: 等前缀(参考 Conventional Commits)。
    3. .gitignore:忽略编译产物、日志、敏感配置。
    4. 分支命名:使用 feature/xxxbugfix/xxxhotfix/xxx 等前缀。
    5. 代码审查:通过 Pull Request/Merge Request 进行同行评审。
    6. 定期同步:经常 git fetch 或 git pull,避免大冲突。
    7. 备份:重要分支及时推送到远程。

    六、常用命令速查表

    1、初始化与配置
    命令 说明
    git init 在当前目录创建新的 Git 仓库。
    git init <project-name> 创建指定名称的仓库目录。
    git clone <repository-url> 克隆远程仓库到本地。
    git clone <repository-url> <directory> 克隆到指定目录。
    git clone -b <branch-name> <repository-url> 克隆特定分支。
    git clone --depth 1 <repository-url> 浅克隆(只克隆最近一次提交)。
    git config --global user.name "Your Name" 全局设置用户名。
    git config --global user.email "email@example.com" 全局设置邮箱。
    git config user.name "Your Name" 设置当前仓库用户名。
    git config --global color.ui true 启用全局彩色输出。
    git config --global core.editor "vim" 设置全局默认编辑器。
    git config --list 查看所有配置。
    git config user.name 查看特定配置项。

    2、日常操作
    命令 说明
    git status 查看工作区和暂存区状态。
    git status -s 简洁格式状态(?? 新文件,A 已暂存,M 已修改,D 已删除)。
    git add <file> 将指定文件添加到暂存区。
    git add . 添加当前目录所有修改和新增的文件到暂存区。
    git add -A 添加所有文件(包括修改、新增、删除)到暂存区。
    git add -i 交互式添加,可选择性暂存文件或部分修改。
    git commit -m "message" 提交暂存区的更改,并附带提交信息。
    git commit 提交,使用默认编辑器输入提交信息。
    git commit -a -m "message" 跳过 git add,直接提交所有已跟踪文件的修改(对新文件无效)。
    git commit -m "message" --no-verify 忽略验证强制提交 可以使用 --no-verify 参数跳过验证

    3、查看历史与差异
    命令 说明
    git log 查看提交历史(详细)。
    git log --oneline 简洁的单行提交历史。
    git log --oneline --graph 图形化显示分支合并历史。
    git log --author="name" 按作者查看提交历史。
    git log --grep="pattern" 按提交信息中的模式搜索。
    git log --since="2 weeks ago" 查看最近两周的提交。
    git log -- <file> 查看某个文件的提交历史。
    git diff 显示工作区与暂存区的差异。
    git diff --staged 或 git diff --cached 显示暂存区与最新提交的差异。
    git diff HEAD 显示工作区与最新提交的差异。
    git diff <commit1> <commit2> -- <file> 比较两个提交之间的特定文件差异。

    4、分支管理
    命令 说明
    git branch 列出所有本地分支(* 表示当前分支)。
    git branch -a 列出所有分支(本地和远程)。
    git branch <branch-name> 创建新分支。
    git branch -d <branch-name> 删除已合并的分支。(本地)
    git branch -D <branch-name> 强制删除未合并的分支。(本地)
    git branch -m <new-name> 重命名当前分支。(本地)
    git switch <branch-name> 切换到指定分支(Git 2.23+)。
    git switch -c <new-branch> 创建并切换到新分支(Git 2.23+)。
    git checkout <branch-name> 切换到指定分支(旧版命令)。
    git checkout -b <new-branch> 创建并切换到新分支(旧版命令)。
    git merge <branch-name> 将指定分支合并到当前分支。
    git merge --no-ff <branch-name> 合并时创建合并提交(保留分支历史)。
    git rebase <branch-name> 将当前分支的提交变基到 <branch-name> 的最新提交之上。
    git rebase -i <commit> 交互式变基,可编辑、合并、重排提交历史

    5、远程仓库操作
    命令 说明
    git remote 列出远程仓库名称。
    git remote -v 列出远程仓库的 URL。
    git remote add <name> <url> 添加新的远程仓库(如 origin)。
    git remote remove <name> 移除远程仓库。
    git remote set-url <name> <new-url> 修改远程仓库 URL。
    git fetch <remote> 从远程仓库获取最新数据(不自动合并)。
    git pull <remote> <branch> 从远程仓库获取并合并(等价于 fetch + merge)。
    git push <remote> <branch> 将本地分支推送到远程仓库。
    git push -u <remote> <branch> 推送并设置上游分支(后续可用 git push 简写)。
    git push <remote> --delete <branch> 删除远程分支。
    git push --force-with-lease 强制推送(更安全的 --force,检查远程是否有新提交)。

    git push origin <分支名> --force

    强制覆盖远程历史 --force 可简写 -f 会覆盖远程仓库的历史记录,请谨慎使用。

    6、撤销与重置
    命令 说明
    git restore <file> 撤销工作区对文件的修改(恢复到暂存区或 HEAD 状态)。
    git restore --staged <file> 将文件从暂存区移出(撤销 git add)。
    git reset HEAD <file> 同 git restore --staged <file>(旧版命令)。
    git commit --amend -m "new message" 修改最近一次提交的信息(或内容)。
    git reset --soft HEAD~1 回退一个提交,提交的更改保留在暂存区。
    git reset --mixed HEAD~1 回退一个提交,更改保留在工作区(默认模式)。
    git reset --hard HEAD~1 危险! 彻底回退一个提交,丢失所有更改。
    git reset --hard <commit-id> 危险! 重置到指定提交,丢失之后所有更改。
    git reflog 查看 HEAD 的操作历史(可用于恢复误删的提交)。

    7、标签 (Tags)
    命令 说明
    git tag 列出所有标签。
    git tag <tag-name> 创建轻量标签(指向特定提交)。
    git tag -a <tag-name> -m "message" 创建附注标签(带信息,推荐)。
    git tag -d <tag-name> 删除本地标签。
    git push origin <tag-name> 推送指定标签到远程。
    git push origin --tags 推送所有本地标签到远程。
    git push origin --delete <tag-name> 删除远程标签。
    git checkout <tag-name> 切换到标签状态(进入“分离头指针”状态)。

    8、储藏 (Stash)
    命令 说明
    git stash 临时保存当前工作区和暂存区的修改。
    git stash push -m "message" 储藏并添加描述信息。
    git stash list 查看储藏列表。
    git stash pop 恢复最近一次储藏并从列表中删除。
    git stash apply 恢复最近一次储藏但不删除。
    git stash apply stash@{1} 恢复指定的储藏。
    git stash drop stash@{0} 删除指定的储藏。
    git stash clear 清空所有储藏。

    9、高级与工具
    命令 说明
    git grep "pattern" 在仓库文件中搜索文本模式。
    git show <commit-id> 显示指定提交的详细信息。
    git show <tag-name> 显示标签指向的提交信息。
    git archive --format=zip --output=project.zip HEAD 将当前 HEAD 打包为 zip 文件。
    git instaweb 启动一个简易的 Web 服务器来浏览仓库(需安装 gitweb)。
    git gc 清理仓库,压缩历史(通常自动运行)。
    git fsck 检查仓库的完整性。

    10、Git Hooks 示例(位于 .git/hooks/ 目录)
    钩子文件 触发时机 用途示例
    pre-commit 提交前 运行代码格式化、静态检查、单元测试。
    pre-push 推送前 运行集成测试、安全扫描。
    post-commit 提交后 发送通知、更新工作项状态。
    prepare-commit-msg 提交信息编辑前 自动生成提交信息模板。

    提示:钩子脚本需赋予执行权限 (chmod +x hook-file)。

    学习资源

    Logo

    这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

    更多推荐