> 技术文档 > 程序员的附加技能:Git 使用从入门到精通

程序员的附加技能:Git 使用从入门到精通

程序员的附加技能: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 命令速查表

程序员的附加技能: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个提交

注意事项

  1. 不要在公共分支上变基(会重写历史)
  2. 变基后需要强制推送:git push --force-with-lease
  3. 团队协作时优先使用合并

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. 最佳实践与注意事项

提交规范

  1. 提交信息清晰描述变更内容
  2. 遵循团队约定的提交规范
  3. 每个提交保持单一责任原则
  4. 避免提交大文件(使用 LFS)
  5. 不要提交敏感信息(密码、密钥)

分支管理策略

  1. 主分支main/master(稳定版)
  2. 开发分支develop(集成环境)
  3. 功能分支feature/*(新功能开发)
  4. 修复分支hotfix/*(紧急修复)
  5. 发布分支release/*(版本准备)

协作注意事项

  1. 频繁拉取上游变更
  2. 推送前在本地运行测试
  3. 使用 --force-with-lease 代替 --force
  4. 定期清理过时分支
  5. 使用 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 使用从入门到精通

提示:使用 git help 查看命令详细帮助
实践是最好的学习方式,多在实际项目中应用这些命令,逐渐形成自己的工作流。