1. 代码回退与历史修改
git reset
模式 | 命令示例 | 作用范围 | 适用场景 |
---|---|---|---|
--soft | git reset --soft HEAD~1 | 仅移动 HEAD 指针 | 重新提交之前的修改 |
--mixed | git reset HEAD~1 (默认) | 重置暂存区 | 取消已 add 但未提交的文件 |
--hard | git reset --hard a1b2c3d | 彻底丢弃工作区和暂存区 | 彻底回退到某个版本(慎用!) |
git revert
git revert <commitid> # 生成一个反向提交
git revert -m 1 <merge_commit> # 撤销合并提交
-
特点:安全撤销(保留历史),适合已推送的提交
git commit --amend
git commit --amend # 修改最近提交信息
git commit --amend --no-edit # 只修改提交内容
注意:仅限未推送的提交!
2. 分支管理
git branch
命令 | 作用 |
---|---|
git branch -f main HEAD~3 | 强制移动分支指针 |
git branch -d feature | 删除已合并分支 |
git branch -D hotfix | 强制删除未合并分支 |
git branch --set-upstream-to=origin/main | 绑定远程分支 |
3. 提交与变更查看
git log
git log --oneline --graph -n 5 # 简洁图形化历史
git log -p -S "keyword" # 搜索代码变更
git log --since="2024-01-01" --author="John" # 条件过滤
git show
git show HEAD~2:src/main.c # 查看历史文件内容
git show a1b2c3d --stat # 显示提交影响的文件
4. 暂存与恢复
git stash
git stash push -m "WIP: login feature" # 暂存并命名
git stash list # 查看暂存栈
git stash apply stash@{1} # 恢复指定暂存
git stash drop stash@{0} # 删除暂存
git checkout HEAD -- <file>
git checkout HEAD -- config.yml # 从最近提交恢复文件
git checkout a1b2c3d -- . # 恢复整个目录到历史版本
5. 差异比较与补丁
git diff
命令 | 比较范围 |
---|---|
git diff | 工作区 vs 暂存区 |
git diff --cached | 暂存区 vs 最新提交 |
git diff HEAD~2 HEAD | 两个提交间的差异 |
git diff --word-diff | 单词级差异显示 |
补丁操作
git diff > changes.patch # 生成补丁
git apply --check changes.patch # 测试应用
git apply changes.patch # 应用补丁
git format-patch HEAD~2 # 生成可邮件发送的补丁
命令对比表
场景 | 推荐命令 | 替代方案 |
---|---|---|
撤销本地修改 | git checkout HEAD -- file | git restore file |
修改提交信息 | git commit --amend | git rebase -i |
安全撤销提交 | git revert | git reset + force push (危险) |
暂存临时改动 | git stash | 手动复制文件 |
进阶技巧
-
组合操作
# 重置到某个提交但保留工作区修改 git reset --hard a1b2c3d && git stash apply
-
精确回退
# 仅回退某个文件到指定提交 git checkout a1b2c3d -- src/main.c
-
排查问题
# 显示谁最后修改了某行代码
git blame -L 10,15 file.txt