1. Git常用命令与场景速查手册
作为开发者每天都要打交道的版本控制工具,Git的命令行操作既是基本功又是效率瓶颈。我整理了这份包含高频命令、典型场景和实用技巧的速查表,特别强化了git fetch等易混淆指令的解析。这份手册的特点在于:
- 按实际工作流分类,非字母排序
- 包含命令组合的典型用法
- 标注了各参数的行为差异
- 附常见报错解决方案
1.1 基础配置与初始化
安装Git后首要工作是身份配置,这会影响所有提交记录:
git config --global user.name "你的姓名" git config --global user.email "公司邮箱" git config --global core.editor vim # 设置默认编辑器查看当前配置:
git config --list初始化新仓库的两种方式:
# 本地初始化 git init # 克隆远程仓库(推荐SSH协议) git clone git@github.com:user/repo.git注意:公司项目建议配置SSH证书而非HTTPS,避免频繁输入密码。生成SSH key的命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
1.2 日常代码提交流程
典型开发周期中的命令序列:
# 查看当前变更状态(养成习惯性操作) git status # 添加文件到暂存区(注意路径规范) git add src/main.js # 添加单个文件 git add . # 添加所有修改(慎用) # 提交到本地仓库(消息格式遵循约定) git commit -m "feat: 新增用户登录模块" # 推送到远程分支(首次推送需建立追踪) git push -u origin feature/login避坑提示:
git add .会包含所有未跟踪文件,建议使用git add -u只添加已跟踪文件的修改,或通过.gitignore文件排除构建产物、IDE配置等。
1.3 分支管理实战
分支操作是Git的核心价值所在:
# 查看所有分支(远程分支用git fetch更新) git branch -av # 创建并切换分支(推荐单条命令完成) git checkout -b hotfix/ssl-cert # 删除已合并的分支(-d参数更安全) git branch -d feature/old # 强制删除未合并分支(慎用) git branch -D experiment分支合并的三种策略:
# 快速合并(线性历史) git merge feature/login # 变基合并(整洁历史线) git rebase main # 三方合并(解决冲突) git merge --no-ff feature/payment经验法则:团队协作使用merge,个人分支使用rebase。执行rebase前务必保证工作区干净。
2. git fetch深度解析
2.1 与git pull的本质区别
多数开发者混淆的两个命令:
git fetch origin # 仅下载远程变更到本地仓库 git pull origin main # = fetch + merge关键差异点:
| 行为 | git fetch | git pull |
|---|---|---|
| 网络操作 | 仅下载 | 下载+合并 |
| 工作区影响 | 无 | 可能产生合并冲突 |
| 安全系数 | 高(可预览变更) | 低(直接修改) |
2.2 高级fetch用法
查看远程分支更新情况:
git fetch --dry-run获取特定分支到本地(不自动合并):
git fetch origin feature/chat:feature/chat-local清理已删除的远程分支引用:
git fetch --prune调试技巧:添加
-v参数查看详细传输过程,如git fetch -v
3. 典型场景解决方案
3.1 撤销操作大全
# 撤销工作区修改(危险操作) git checkout -- file.txt # 撤销暂存区修改(回退到工作区) git reset HEAD file.txt # 修改最后一次提交(未push时) git commit --amend -m "新的提交信息" # 回退到指定提交(三种模式) git reset --soft HEAD~1 # 保留修改到暂存区 git reset --mixed HEAD~1 # 保留修改到工作区(默认) git reset --hard HEAD~1 # 彻底丢弃修改3.2 冲突解决流程
- 合并时出现冲突:
Auto-merging src/index.js CONFLICT (content): Merge conflict in src/index.js手动编辑文件,保留需要的代码(冲突标记为
<<<<<<<到>>>>>>>)标记冲突已解决:
git add src/index.js git commit # 不要加-m参数,使用自动生成的合并消息专业工具推荐:配置
git mergetool使用VS Code或Beyond Compare进行可视化冲突解决
3.3 找回丢失的提交
查看操作历史(含已删除的commit):
git reflog重置到特定操作点:
git reset --hard HEAD@{5}4. 高效工作技巧
4.1 别名配置
在~/.gitconfig中添加:
[alias] st = status ci = commit br = branch co = checkout df = diff lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative4.2 交互式操作
选择性提交部分修改:
git add -p # 交互式选择代码块修改多个历史提交:
git rebase -i HEAD~3 # 编辑最近3个提交4.3 子模块管理
添加依赖库:
git submodule add https://github.com/jquery/jquery.git lib/jquery更新所有子模块:
git submodule update --init --recursive5. 企业级实践建议
5.1 提交消息规范
推荐格式:
类型(范围): 简要描述 详细说明(可选) 关联Issue: #123常用类型:
- feat:新功能
- fix:错误修复
- docs:文档变更
- style:代码格式
- refactor:重构
- test:测试相关
5.2 代码审查流程
- 创建特性分支:
git checkout -b feature/oauth2- 开发完成后推送到远程:
git push origin feature/oauth2在Git平台创建Pull Request
根据审查意见修改后:
git commit --amend # 修正最后一次提交 git push -f # 强制更新(仅限特性分支)5.3 大型仓库优化
部分克隆(仅获取最新历史):
git clone --depth=1 https://github.com/vuejs/vue.git稀疏检出(只下载指定目录):
git init vue-core cd vue-core git remote add origin https://github.com/vuejs/vue.git git config core.sparsecheckout true echo "src/core" >> .git/info/sparse-checkout git pull origin main6. 疑难问题排查
6.1 常见错误处理
问题1:fatal: refusing to merge unrelated histories
# 当合并两个独立开发的仓库时出现 git merge --allow-unrelated-histories branch-name问题2:error: failed to push some refs
# 通常因远程有本地不存在的提交导致 git pull --rebase origin main git push问题3:warning: LF will be replaced by CRLF
# 统一换行符风格(Windows开发建议) git config --global core.autocrlf true6.2 性能优化
清理历史大文件:
# 使用BFG工具清理(需Java环境) java -jar bfg.jar --strip-blobs-bigger-than 100M repo.git重建本地仓库:
git gc --aggressive git repack -a -d --depth=250 --window=2507. 可视化工具链
虽然命令行是核心,但合理使用GUI工具能提升效率:
- GitKraken:跨平台图形客户端
- SourceTree:免费的Git管理工具
- VS Code Git插件:内置的版本控制功能
- Tig:终端下的Git浏览器(
brew install tig)
配置差异对比工具:
git config --global diff.tool vscode git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"