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

文章目录

1. Git 基础概念
核心概念
- 仓库(Repository):项目的历史记录和元数据存储
- 提交(Commit):项目的快照,包含唯一 SHA-1 哈希值
- 分支(Branch):指向提交的可移动指针
- HEAD:当前工作位置的指针
- 暂存区(Staging Area):准备提交的中间区域
文件状态生命周期
git addgit commit修改文件git addgit checkoutUntrackedStagedCommittedModified
2. 安装与配置
安装 Git
# Ubuntu/Debiansudoapt-getinstallgit# CentOS/RHELsudo yum installgit# macOS (Homebrew) brew installgit# Windows# 下载安装包:https://git-scm.com/download/win基础配置
# 设置用户名和邮箱(全局)git config --global user.name "Your Name"git config --global user.email "[email protected]"# 设置默认编辑器git config --global core.editor "code --wait"# VS Code# 查看配置git config --list # 设置别名git config --global alias.st status git config --global alias.ci commit git config --global alias.co checkout git config --global alias.br branch 重要配置文件位置
- 系统级:
/etc/gitconfig - 用户级:
~/.gitconfig - 仓库级:
.git/config
3. 仓库操作
初始化仓库
# 新建仓库mkdir project &&cd project git init # 克隆现有仓库git clone https://github.com/user/repo.git git 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. 添加到暂存区gitadd file.txt gitadd.# 添加所有变更gitadd -p # 交互式添加(部分添加)# 4. 提交git commit -m "Add initial file"git commit -am "修改说明"# 跳过add直接提交已跟踪文件# 5. 查看历史git log git log --oneline --graph --all # 图形化查看提交规范示例
git commit -m "feat: 添加用户登录功能 - 实现JWT认证 - 添加登录API端点 - 完善错误处理 Close #123"推荐使用约定式提交规范:feat: 新功能fix: bug修复docs: 文档变更style: 格式变更refactor: 重构代码test: 测试变更chore: 构建或辅助工具变更
5. 分支管理
分支操作
# 创建分支git branch feature-login git checkout -b feature-login # 创建并切换# 切换分支git checkout main git switch main # Git 2.23+ 推荐方式# 合并分支git checkout main git merge feature-login # 删除分支git branch -d feature-login # 安全删除git branch -D feature-login # 强制删除未合并分支# 重命名分支git branch -m old-name new-name 分支策略示例
变基(Rebase)与合并(Merge)
# 合并(保留完整历史)git checkout main git merge feature # 变基(线性历史)git checkout feature git 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 main git push -u origin main # 设置上游跟踪# 删除远程分支git push origin --delete feature-old 协作工作流
开发者A远程仓库开发者Bgit push origin main通知更新git fetch origingit rebase origin/maingit push origin feature开发者A远程仓库开发者B
解决冲突
当多人修改同一文件时:
# 1. 拉取最新代码(会提示冲突)git pull origin main # 2. 打开冲突文件<<<<<<< HEAD 本地修改内容 ======= 远程修改内容 >>>>>>> commit-hash # 3. 手动解决冲突后gitadd resolved-file.txt git 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 start git 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.txt git 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# 运行测试npmtest客户端钩子
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 main git 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证书sudoapt-getinstall ca-certificates 5. 中文文件名乱码
# 显示UTF-8文件名git config --global core.quotepath falseGit 命令速查表
| 类别 | 命令 | 描述 |
|---|---|---|
| 基础 | git init | 初始化仓库 |
git clone <url> | 克隆仓库 | |
git status | 查看状态 | |
| 提交 | git add <file> | 添加文件到暂存区 |
git commit -m "msg" | 提交变更 | |
git commit --amend | 修改上次提交 | |
| 分支 | git branch | 列出分支 |
git checkout <branch> | 切换分支 | |
git merge <branch> | 合并分支 | |
| 远程 | git fetch | 获取远程更新 |
git pull | 拉取并合并 | |
git push | 推送到远程 | |
| 撤销 | git restore <file> | 撤销工作区修改 |
git reset <commit> | 重置到指定提交 | |
git revert <commit> | 创建撤销提交 | |
| 日志 | git log | 查看提交历史 |
git diff | 查看差异 | |
| 高级 | git stash | 暂存变更 |
git rebase | 变基操作 | |
git bisect | 二分查找问题 |

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