Git 使用技巧参考手册
专为新手用户设计的 Git 实用技巧指南
目录
基础概念
什么是 Git?
Git 是一个分布式版本控制系统,用于跟踪文件的变化。想象成是一个"时光机",可以记录代码的每个版本。
核心概念
- 仓库 (Repository): 项目的文件夹,包含所有代码和历史记录
- 提交 (Commit): 代码的一个"快照",包含变更和说明
- 分支 (Branch): 代码的平行开发线,互不干扰
- 远程仓库 (Remote): 网络上的代码仓库,如 GitHub、Gitee
提交历史管理
1. 修改最后一次提交 (git commit --amend
)
作用
修改最近一次提交的内容或提交信息,而不创建新的提交。
使用场景
- 忘记添加某个文件到提交中
- 提交信息写错了需要修改
- 想要合并多个小提交为一个
使用方法
# 修改提交信息
git commit --amend -m "新的提交信息"
# 修改提交内容(添加文件)
git add 忘记的文件.txt
git commit --amend --no-edit
# 修改提交内容(修改文件)
# 先修改文件,然后:
git add 修改的文件.txt
git commit --amend --no-edit
效果
- 原来的提交被替换为新的提交
- 提交历史更整洁
- 不会增加额外的提交记录
️ 注意事项
- 只能修改最后一次提交
- 如果已经推送到远程,需要强制推送
- 不要修改已经分享给别人的提交
2. 交互式变基 (git rebase -i
)
作用
重新整理提交历史,可以合并、分割、重排序提交。
使用场景
- 合并多个小提交
- 重新排序提交
- 修改提交信息
- 删除不需要的提交
使用方法
# 修改最近3个提交
git rebase -i HEAD~3
# 修改从某个提交开始的所有提交
git rebase -i 提交hash
交互式界面操作
pick abc1234 第一个提交
squash def5678 第二个提交 # 合并到上一个
edit ghi9012 第三个提交 # 暂停编辑
drop jkl3456 第四个提交 # 删除提交
效果
- 提交历史更清晰
- 可以合并相关的小提交
- 删除无用的提交
分支操作技巧
1. 创建和切换分支
作用
创建新的开发分支,避免影响主分支。
使用场景
- 开发新功能
- 修复 bug
- 实验性开发
使用方法
# 创建并切换到新分支
git checkout -b 新分支名
# 或者使用新语法
git switch -c 新分支名
# 基于特定提交创建分支
git checkout -b 新分支名 提交hash
2. 分支合并策略
作用
将分支的更改合并到目标分支。
合并方式对比
方式 | 命令 | 特点 | 适用场景 |
---|---|---|---|
快进合并 | git merge --ff-only | 保持线性历史 | 简单功能开发 |
普通合并 | git merge | 创建合并提交 | 功能分支合并 |
变基合并 | git rebase | 重写历史 | 保持历史整洁 |
使用方法
# 切换到目标分支
git checkout main
# 合并分支
git merge 功能分支
# 删除已合并的分支
git branch -d 功能分支
远程仓库操作
1. 强制推送 (git push --force
)
作用
强制更新远程分支,覆盖远程的提交历史。
使用场景
- 修改了本地提交历史(如 amend、rebase)
- 需要覆盖远程的错误提交
- 清理提交历史
使用方法
# 强制推送(危险)
git push --force
# 安全强制推送(推荐)
git push --force-with-lease
# 强制推送到特定分支
git push --force-with-lease origin 分支名
效果对比
--force
: 直接覆盖,可能丢失他人工作--force-with-lease
: 检查远程是否有新提交,更安全
️ 注意事项
- 只在私有分支或确定安全时使用
- 不要在主分支上强制推送
- 使用前确保备份重要数据
2. 拉取远程更改
作用
获取远程仓库的最新更改。
使用方法
# 拉取并合并
git pull
# 拉取但不合并
git fetch
# 拉取特定分支
git pull origin 分支名
# 拉取所有远程分支
git fetch --all
代码合并与冲突解决
1. 处理合并冲突
冲突产生原因
- 多人同时修改同一文件的同一部分
- 分支合并时的代码冲突
解决步骤
# 1. 尝试合并
git merge 分支名
# 2. 如果有冲突,查看冲突文件
git status
# 3. 编辑冲突文件,选择保留的代码
# 冲突标记:
# <<<<<<< HEAD
# 当前分支的代码
# =======
# 要合并分支的代码
# >>>>>>> 分支名
# 4. 标记冲突已解决
git add 冲突文件
# 5. 完成合并
git commit
2. 使用合并工具
作用
可视化解决冲突,更直观。
配置合并工具
# 配置 VS Code 作为合并工具
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# 使用合并工具
git mergetool
撤销与回退操作
1. 撤销工作区更改
作用
放弃对文件的修改,恢复到上次提交的状态。
使用方法
# 撤销单个文件
git checkout -- 文件名
# 撤销所有文件
git checkout -- .
# 新语法
git restore 文件名
git restore .
2. 撤销暂存区更改
作用
将已添加到暂存区的文件移回工作区。
使用方法
# 撤销单个文件
git reset HEAD 文件名
# 撤销所有文件
git reset HEAD
# 新语法
git restore --staged 文件名
git restore --staged .
3. 回退提交
作用
撤销已提交的更改。
使用方法
# 软回退(保留更改)
git reset --soft HEAD~1
# 混合回退(默认,保留工作区)
git reset --mixed HEAD~1
# 硬回退(完全删除)
git reset --hard HEAD~1
# 回退到特定提交
git reset --hard 提交hash
效果对比
--soft
: 只移动 HEAD,保留暂存区和工作区--mixed
: 移动 HEAD 和暂存区,保留工作区--hard
: 完全回退,丢失所有更改
高级技巧
1. 暂存更改 (git stash
)
作用
临时保存工作区的更改,方便切换分支。
使用场景
- 需要切换分支但工作未完成
- 临时保存实验性代码
- 处理紧急 bug 修复
使用方法
# 暂存当前更改
git stash
# 暂存并添加说明
git stash save "功能开发中"
# 查看暂存列表
git stash list
# 恢复暂存
git stash pop
# 恢复特定暂存
git stash apply stash@{0}
# 删除暂存
git stash drop stash@{0}
2. 查找提交历史
作用
快速定位特定的提交或更改。
使用方法
# 查看提交历史
git log --oneline
# 查看文件历史
git log -- 文件名
# 查看谁修改了某行代码
git blame 文件名
# 搜索提交信息
git log --grep="关键词"
# 查看两个提交的差异
git diff 提交1 提交2
3. 子模块管理
作用
在项目中包含其他 Git 仓库。
使用方法
# 添加子模块
git submodule add https://github.com/user/repo.git 路径
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
# 克隆包含子模块的项目
git clone --recursive https://github.com/user/project.git
常见问题解决
1. 提交到错误分支
问题
代码提交到了错误的分支。
解决方案
# 1. 记录提交 hash
git log --oneline
# 2. 切换到正确分支
git checkout 正确分支
# 3. 应用提交
git cherry-pick 提交hash
# 4. 从错误分支删除提交
git checkout 错误分支
git reset --hard HEAD~1
2. 忘记添加文件到提交
问题
提交后发现忘记添加某个文件。
解决方案
# 添加文件并修改提交
git add 忘记的文件
git commit --amend --no-edit
3. 提交信息写错
问题
提交信息有拼写错误或描述不准确。
解决方案
# 修改最后一次提交信息
git commit --amend -m "正确的提交信息"
4. 误删文件
问题
不小心删除了重要文件。
解决方案
# 恢复文件
git checkout HEAD -- 文件名
# 或者
git restore 文件名
最佳实践
1. 提交规范
提交信息格式
类型(范围): 简短描述
详细描述(可选)
相关Issue: #123
常用类型
feat
: 新功能fix
: 修复 bugdocs
: 文档更新style
: 代码格式调整refactor
: 代码重构test
: 测试相关chore
: 构建过程或辅助工具的变动
示例
feat(auth): 添加用户登录功能
- 实现用户名密码登录
- 添加记住登录状态
- 支持第三方登录
相关Issue: #123
2. 分支命名规范
命名格式
类型/描述
常用类型
feature/
: 新功能bugfix/
: 修复 bughotfix/
: 紧急修复release/
: 发布版本chore/
: 维护任务
示例
feature/user-authentication
bugfix/login-error-handling
hotfix/security-patch
3. 工作流程建议
日常开发流程
- 从主分支创建功能分支
- 在功能分支上开发
- 定期提交代码
- 开发完成后合并到主分支
- 删除功能分支
代码审查流程
- 推送功能分支到远程
- 创建 Pull Request/Merge Request
- 等待代码审查
- 根据反馈修改代码
- 审查通过后合并
4. 安全建议
保护重要分支
# 设置分支保护
git config branch.main.protect true
定期备份
# 创建备份分支
git branch backup-$(date +%Y%m%d)
使用 .gitignore
# 忽略敏感文件
echo "config/secrets.yml" >> .gitignore
echo "*.log" >> .gitignore
常用命令速查表
基础操作
命令 | 作用 |
---|---|
git init | 初始化仓库 |
git clone <url> | 克隆仓库 |
git add <file> | 添加文件到暂存区 |
git commit -m "msg" | 提交更改 |
git status | 查看状态 |
git log | 查看提交历史 |
分支操作
命令 | 作用 |
---|---|
git branch | 查看分支 |
git branch <name> | 创建分支 |
git checkout <name> | 切换分支 |
git merge <branch> | 合并分支 |
git branch -d <name> | 删除分支 |
远程操作
命令 | 作用 |
---|---|
git remote -v | 查看远程仓库 |
git push origin <branch> | 推送到远程 |
git pull origin <branch> | 从远程拉取 |
git fetch | 获取远程更新 |
撤销操作
命令 | 作用 |
---|---|
git checkout -- <file> | 撤销文件修改 |
git reset HEAD <file> | 撤销暂存 |
git reset --hard HEAD~1 | 回退提交 |
git revert <commit> | 撤销提交 |
总结
Git 是一个强大的版本控制工具,掌握这些技巧可以大大提高开发效率。记住:
- 安全第一: 重要操作前先备份
- 小步提交: 频繁提交,保持历史清晰
- 规范命名: 使用统一的命名规范
- 团队协作: 遵循团队的工作流程
- 持续学习: Git 功能丰富,不断学习新技巧
希望这份手册能帮助你更好地使用 Git!如有问题,欢迎随时查阅或询问。
最后更新: 2025年1月