Git 使用技巧参考手册

专为新手用户设计的 Git 实用技巧指南

目录

  1. 基础概念
  2. 提交历史管理
  3. 分支操作技巧
  4. 远程仓库操作
  5. 代码合并与冲突解决
  6. 撤销与回退操作
  7. 高级技巧
  8. 常见问题解决
  9. 最佳实践

基础概念

什么是 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: 修复 bug
  • docs: 文档更新
  • style: 代码格式调整
  • refactor: 代码重构
  • test: 测试相关
  • chore: 构建过程或辅助工具的变动

示例

feat(auth): 添加用户登录功能

- 实现用户名密码登录
- 添加记住登录状态
- 支持第三方登录

相关Issue: #123

2. 分支命名规范

命名格式

类型/描述

常用类型

  • feature/: 新功能
  • bugfix/: 修复 bug
  • hotfix/: 紧急修复
  • release/: 发布版本
  • chore/: 维护任务

示例

feature/user-authentication
bugfix/login-error-handling
hotfix/security-patch

3. 工作流程建议

日常开发流程

  1. 从主分支创建功能分支
  2. 在功能分支上开发
  3. 定期提交代码
  4. 开发完成后合并到主分支
  5. 删除功能分支

代码审查流程

  1. 推送功能分支到远程
  2. 创建 Pull Request/Merge Request
  3. 等待代码审查
  4. 根据反馈修改代码
  5. 审查通过后合并

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>撤销提交