程序员的附加技能:Git 使用从入门到精通
文章目录
-
- 1. Git 基础概念
-
- 核心概念
- 文件状态生命周期
- 2. 安装与配置
-
- 安装 Git
- 基础配置
- 重要配置文件位置
- 3. 仓库操作
-
- 初始化仓库
- 仓库结构
- 4. 基础工作流
-
- 标准工作流程
- 提交规范示例
- 5. 分支管理
-
- 分支操作
- 分支策略示例
- 变基(Rebase)与合并(Merge)
- 6. 远程协作
-
- 远程仓库操作
- 协作工作流
- 解决冲突
- 7. 高级操作
-
- 贮藏变更
- 二分查找(定位问题提交)
- 重写历史
- 大文件存储(LFS)
- 8. 撤销与恢复
-
- 撤销工作区修改
- 撤销暂存区文件
- 撤销提交
- 恢复删除的文件
- 9. 子模块与工作树
-
- 子模块
- 多工作树
- 10. Git 钩子
-
- 常用钩子示例
- 客户端钩子
- 服务端钩子
- 11. 最佳实践与注意事项
-
- 提交规范
- 分支管理策略
- 协作注意事项
- 性能优化
- 12. 常见问题解决方案
-
- 1. 提交了错误文件
- 2. 忘记创建分支直接提交到 main
- 3. 合并后需要撤销
- 4. 证书问题
- 5. 中文文件名乱码
- Git 命令速查表
1. Git 基础概念
核心概念
- 仓库(Repository):项目的历史记录和元数据存储
- 提交(Commit):项目的快照,包含唯一 SHA-1 哈希值
- 分支(Branch):指向提交的可移动指针
- HEAD:当前工作位置的指针
- 暂存区(Staging Area):准备提交的中间区域
文件状态生命周期
#mermaid-svg-AEJGQvs7Xln9iLH6 {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .error-icon{fill:#552222;}#mermaid-svg-AEJGQvs7Xln9iLH6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AEJGQvs7Xln9iLH6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .marker.cross{stroke:#333333;}#mermaid-svg-AEJGQvs7Xln9iLH6 svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AEJGQvs7Xln9iLH6 .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .cluster-label text{fill:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .cluster-label span{color:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .label text,#mermaid-svg-AEJGQvs7Xln9iLH6 span{fill:#333;color:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .node rect,#mermaid-svg-AEJGQvs7Xln9iLH6 .node circle,#mermaid-svg-AEJGQvs7Xln9iLH6 .node ellipse,#mermaid-svg-AEJGQvs7Xln9iLH6 .node polygon,#mermaid-svg-AEJGQvs7Xln9iLH6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AEJGQvs7Xln9iLH6 .node .label{text-align:center;}#mermaid-svg-AEJGQvs7Xln9iLH6 .node.clickable{cursor:pointer;}#mermaid-svg-AEJGQvs7Xln9iLH6 .arrowheadPath{fill:#333333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AEJGQvs7Xln9iLH6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-AEJGQvs7Xln9iLH6 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-AEJGQvs7Xln9iLH6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AEJGQvs7Xln9iLH6 .cluster text{fill:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 .cluster span{color:#333;}#mermaid-svg-AEJGQvs7Xln9iLH6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AEJGQvs7Xln9iLH6 :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} git add git commit 修改文件 git add git checkout Untracked Staged Committed Modified
2. 安装与配置
安装 Git
# Ubuntu/Debiansudo apt-get install git# CentOS/RHELsudo yum install git# macOS (Homebrew)brew install git# Windows# 下载安装包:https://git-scm.com/download/win
基础配置
# 设置用户名和邮箱(全局)git config --global user.name \"Your Name\"git config --global user.email \"email@example.com\"# 设置默认编辑器git config --global core.editor \"code --wait\" # VS Code# 查看配置git config --list# 设置别名git config --global alias.st statusgit config --global alias.ci commitgit config --global alias.co checkoutgit config --global alias.br branch
重要配置文件位置
- 系统级:
/etc/gitconfig
- 用户级:
~/.gitconfig
- 仓库级:
.git/config
3. 仓库操作
初始化仓库
# 新建仓库mkdir project && cd projectgit init# 克隆现有仓库git clone https://github.com/user/repo.gitgit clone --depth 1 https://github.com/user/repo.git # 浅克隆(仅最新提交)
仓库结构
.git/├── HEAD # 当前分支指针├── config # 仓库配置├── objects/ # 数据对象├── refs/ # 分支和标签指针│ ├── heads/ # 本地分支│ └── tags/ # 标签└── index # 暂存区文件
4. 基础工作流
标准工作流程
# 1. 修改文件echo \"Hello World\" > file.txt# 2. 查看状态git status# 3. 添加到暂存区git add file.txtgit add . # 添加所有变更git add -p # 交互式添加(部分添加)# 4. 提交git commit -m \"Add initial file\"git commit -am \"修改说明\" # 跳过add直接提交已跟踪文件# 5. 查看历史git loggit log --oneline --graph --all # 图形化查看
提交规范示例
git commit -m \"feat: 添加用户登录功能- 实现JWT认证- 添加登录API端点- 完善错误处理Close #123\"
推荐使用约定式提交规范:
- feat: 新功能
- fix: bug修复
- docs: 文档变更
- style: 格式变更
- refactor: 重构代码
- test: 测试变更
- chore: 构建或辅助工具变更
5. 分支管理
分支操作
# 创建分支git branch feature-logingit checkout -b feature-login # 创建并切换# 切换分支git checkout maingit switch main # Git 2.23+ 推荐方式# 合并分支git checkout maingit merge feature-login# 删除分支git branch -d feature-login # 安全删除git branch -D feature-login # 强制删除未合并分支# 重命名分支git branch -m old-name new-name
分支策略示例
#mermaid-svg-HK6xjCZaVcorF31Y {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HK6xjCZaVcorF31Y .error-icon{fill:#552222;}#mermaid-svg-HK6xjCZaVcorF31Y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HK6xjCZaVcorF31Y .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-HK6xjCZaVcorF31Y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HK6xjCZaVcorF31Y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HK6xjCZaVcorF31Y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HK6xjCZaVcorF31Y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HK6xjCZaVcorF31Y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HK6xjCZaVcorF31Y .marker.cross{stroke:#333333;}#mermaid-svg-HK6xjCZaVcorF31Y svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HK6xjCZaVcorF31Y .commit-id,#mermaid-svg-HK6xjCZaVcorF31Y .commit-msg,#mermaid-svg-HK6xjCZaVcorF31Y .branch-label{fill:lightgrey;color:lightgrey;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-HK6xjCZaVcorF31Y :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}
变基(Rebase)与合并(Merge)
# 合并(保留完整历史)git checkout maingit merge feature# 变基(线性历史)git checkout featuregit rebase main# 交互式变基(修改历史)git rebase -i HEAD~3 # 修改最近3个提交
注意事项:
- 不要在公共分支上变基(会重写历史)
- 变基后需要强制推送:
git push --force-with-lease
- 团队协作时优先使用合并
6. 远程协作
远程仓库操作
# 添加远程仓库git remote add origin https://github.com/user/repo.git# 查看远程git remote -v# 重命名远程git remote rename origin upstream# 移除远程git remote remove origin# 拉取更新git fetch origin # 仅获取元数据git pull origin main # fetch + mergegit pull --rebase # fetch + rebase(推荐)# 推送分支git push origin maingit push -u origin main # 设置上游跟踪# 删除远程分支git push origin --delete feature-old
协作工作流
#mermaid-svg-M6vesOpCI9Bumypx {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-M6vesOpCI9Bumypx .error-icon{fill:#552222;}#mermaid-svg-M6vesOpCI9Bumypx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-M6vesOpCI9Bumypx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-M6vesOpCI9Bumypx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-M6vesOpCI9Bumypx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-M6vesOpCI9Bumypx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-M6vesOpCI9Bumypx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-M6vesOpCI9Bumypx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-M6vesOpCI9Bumypx .marker.cross{stroke:#333333;}#mermaid-svg-M6vesOpCI9Bumypx svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-M6vesOpCI9Bumypx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-M6vesOpCI9Bumypx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-M6vesOpCI9Bumypx .actor-line{stroke:grey;}#mermaid-svg-M6vesOpCI9Bumypx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-M6vesOpCI9Bumypx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-M6vesOpCI9Bumypx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-M6vesOpCI9Bumypx .sequenceNumber{fill:white;}#mermaid-svg-M6vesOpCI9Bumypx #sequencenumber{fill:#333;}#mermaid-svg-M6vesOpCI9Bumypx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-M6vesOpCI9Bumypx .messageText{fill:#333;stroke:#333;}#mermaid-svg-M6vesOpCI9Bumypx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-M6vesOpCI9Bumypx .labelText,#mermaid-svg-M6vesOpCI9Bumypx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-M6vesOpCI9Bumypx .loopText,#mermaid-svg-M6vesOpCI9Bumypx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-M6vesOpCI9Bumypx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-M6vesOpCI9Bumypx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-M6vesOpCI9Bumypx .noteText,#mermaid-svg-M6vesOpCI9Bumypx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-M6vesOpCI9Bumypx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-M6vesOpCI9Bumypx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-M6vesOpCI9Bumypx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-M6vesOpCI9Bumypx .actorPopupMenu{position:absolute;}#mermaid-svg-M6vesOpCI9Bumypx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-M6vesOpCI9Bumypx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-M6vesOpCI9Bumypx .actor-man circle,#mermaid-svg-M6vesOpCI9Bumypx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-M6vesOpCI9Bumypx :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 开发者A 远程仓库 开发者B git push origin main 通知更新 git fetch origin git rebase origin/main git push origin feature 开发者A 远程仓库 开发者B
解决冲突
当多人修改同一文件时:
# 1. 拉取最新代码(会提示冲突)git pull origin main# 2. 打开冲突文件<<<<<<< HEAD本地修改内容=======远程修改内容>>>>>>> commit-hash# 3. 手动解决冲突后git add resolved-file.txtgit commit -m \"解决合并冲突\"git push
7. 高级操作
贮藏变更
# 临时保存未提交的修改git stash# 查看贮藏列表git stash list# 应用贮藏git stash apply stash@{0}# 创建新分支并应用贮藏git stash branch new-feature# 删除贮藏git stash drop stash@{0}
二分查找(定位问题提交)
git bisect startgit bisect bad # 当前版本有问题git bisect good v1.0 # v1.0版本正常# 测试当前版本后标记结果git bisect good # 如果当前版本正常git bisect bad # 如果当前版本有问题# 结束后重置git bisect reset
重写历史
# 修改最近一次提交git commit --amend# 交互式重写多个提交git rebase -i HEAD~3# 选项说明:# pick: 使用提交# reword: 修改提交信息# edit: 修改提交内容# squash: 合并到前一个提交# fixup: 合并并丢弃提交信息# drop: 删除提交
大文件存储(LFS)
# 安装Git LFSgit lfs install# 跟踪大文件类型git lfs track \"*.psd\"git lfs track \"*.zip\"# 查看跟踪的文件git lfs ls-files
8. 撤销与恢复
撤销工作区修改
# 放弃单个文件修改git checkout -- filename.txt# 放弃所有修改git restore . # Git 2.23+git checkout -- .
撤销暂存区文件
git reset HEAD filename.txtgit restore --staged filename.txt # Git 2.23+
撤销提交
# 撤销上一次提交(保留修改)git reset --soft HEAD~1# 完全撤销提交(丢弃修改)git reset --hard HEAD~1# 恢复误删的提交git reflog # 查找提交哈希git reset --hard <commit-hash>
恢复删除的文件
# 查看删除历史git log --diff-filter=D -- path/to/file# 恢复文件git checkout <commit-hash>^ -- path/to/file
9. 子模块与工作树
子模块
# 添加子模块git submodule add https://github.com/user/lib.git# 克隆包含子模块的项目git clone --recurse-submodules https://github.com/user/project.git# 更新子模块git submodule update --init --recursive
多工作树
# 创建工作树git worktree add ../hotfix hotfix-branch# 列出工作树git worktree list# 移除工作树git worktree remove hotfix-branch
10. Git 钩子
常用钩子示例
# .git/hooks/pre-commit#!/bin/sh# 运行代码检查npm run lint# .git/hooks/pre-push#!/bin/sh# 运行测试npm test
客户端钩子
pre-commit
: 提交前运行prepare-commit-msg
: 准备提交信息commit-msg
: 验证提交信息post-commit
: 提交完成后
服务端钩子
pre-receive
: 处理推送前update
: 按分支处理post-receive
: 推送完成后
最佳实践:使用 Husky 管理 Git 钩子
11. 最佳实践与注意事项
提交规范
- 提交信息清晰描述变更内容
- 遵循团队约定的提交规范
- 每个提交保持单一责任原则
- 避免提交大文件(使用 LFS)
- 不要提交敏感信息(密码、密钥)
分支管理策略
- 主分支:
main
/master
(稳定版) - 开发分支:
develop
(集成环境) - 功能分支:
feature/*
(新功能开发) - 修复分支:
hotfix/*
(紧急修复) - 发布分支:
release/*
(版本准备)
协作注意事项
- 频繁拉取上游变更
- 推送前在本地运行测试
- 使用
--force-with-lease
代替--force
- 定期清理过时分支
- 使用 Pull Request/Merge Request 进行代码审查
性能优化
# 仓库维护git gc --auto# 清理历史大文件(使用 BFG)bfg --delete-files \'*.zip\' my-repo.git# 浅克隆大型仓库git clone --depth 1 https://github.com/large-repo.git
12. 常见问题解决方案
1. 提交了错误文件
# 保留文件但从Git历史中移除git filter-branch --tree-filter \'rm -f sensitive.txt\' HEAD# 更高效的工具git filter-repo --invert-paths --path sensitive.txt
2. 忘记创建分支直接提交到 main
# 1. 创建新分支保存当前状态git branch temp-branch# 2. 重置main分支git checkout maingit reset --hard origin/main# 3. 切换到新分支继续工作git checkout temp-branch
3. 合并后需要撤销
# 撤销合并提交git revert -m 1 <merge-commit-hash>
4. 证书问题
# 忽略SSL验证(临时解决)git config --global http.sslVerify false# 永久解决方案:更新CA证书sudo apt-get install ca-certificates
5. 中文文件名乱码
# 显示UTF-8文件名git config --global core.quotepath false
Git 命令速查表
git init
git clone
git status
git add
git commit -m \"msg\"
git commit --amend
git branch
git checkout
git merge
git fetch
git pull
git push
git restore
git reset
git revert
git log
git diff
git stash
git rebase
git bisect
提示:使用
git help
查看命令详细帮助
实践是最好的学习方式,多在实际项目中应用这些命令,逐渐形成自己的工作流。