Git 使用大全攻略:从入门到精通
本文全面介绍了Git的使用方法,从基础概念到高级技巧。主要内容包括:Git基础概念(仓库、工作区等);安装配置方法;分支管理策略(GitFlow/GitHubFlow/GitLabFlow);GitHooks自动化脚本(pre-commit/pre-push等);最佳实践(小步提交、分支命名等);常用命令速查表(初始化、日常操作、分支管理、远程操作等10类命令)。文章特别强调了GitHooks在企
本文将带你从零开始,全面了解 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(环境驱动)
结合环境分支(如 production、staging)。
- 基于 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 为例)
- 进入钩子目录:
cd .git/hooks - 创建脚本:
#!/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 - 赋予执行权限:
chmod +x pre-commit
3. 推荐工具
- pre-commit:一个框架,简化多语言钩子管理。
- Husky:Node.js 项目常用的 Hooks 管理工具,通过
package.json配置。
企业实践:在
pre-commit中集成代码格式化(Prettier)、静态检查(ESLint、Checkstyle),在pre-push中运行关键测试,确保提交质量。
五、最佳实践
- 小步提交:每次提交只做一件事,信息清晰。
- 写好提交信息:使用
feat:,fix:,docs:,chore:等前缀(参考 Conventional Commits)。 .gitignore:忽略编译产物、日志、敏感配置。- 分支命名:使用
feature/xxx,bugfix/xxx,hotfix/xxx等前缀。 - 代码审查:通过 Pull Request/Merge Request 进行同行评审。
- 定期同步:经常
git fetch或git pull,避免大冲突。 - 备份:重要分支及时推送到远程。
六、常用命令速查表
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,检查远程是否有新提交)。 |
|
|
强制覆盖远程历史 --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)。
学习资源
- 官方文档:Git
- 交互式学习:Learn Git Branching
- 图形化工具:GitHub Desktop、SourceTree、GitKraken
- 书籍:《Pro Git》(免费在线版)
更多推荐



所有评论(0)