git reset --soft HEAD和git stash

Git 重要命令使用笔记

git reset --soft HEAD^

基本概念

git reset --soft HEAD^ 是一个非常有用的 Git 命令,用于撤销最近的一次提交,但保留所有更改内容。

命令解释

  • git reset: 重置当前分支的 HEAD 指针
  • --soft: 软重置模式,只移动 HEAD 指针,保留暂存区和工作区的内容
  • HEAD^: 表示当前提交的上一个提交(HEAD~1 的简写)

使用场景

  1. 提交信息写错了:想要重新编写提交信息
  2. 提交太早了:想要添加更多文件到这次提交中
  3. 提交内容有误:需要修改提交的内容
  4. 合并多个小提交:将多个小提交合并成一个大提交

操作步骤示例

场景一:修改最近一次提交信息

# 当前状态:刚刚提交了一个 commit,但提交信息写错了
git log --oneline -3
# abc1234 修复了一个小bug  <- 想要修改这个提交信息
# def5678 添加了新功能
# ghi9012 初始提交

# 执行软重置
git reset --soft HEAD^

# 查看状态
git status
# 所有之前提交的文件现在都在暂存区中

# 重新提交,使用正确的提交信息
git commit -m "修复了登录页面的验证错误"

场景二:向最近一次提交添加更多文件

# 当前状态:刚提交了一些文件,但忘记添加其他相关文件
git log --oneline -1
# abc1234 添加了用户管理功能

# 添加遗漏的文件
echo "新增的配置文件" > config.json
git add config.json

# 执行软重置
git reset --soft HEAD^

# 现在暂存区包含了原来的文件 + 新添加的文件
git status

# 重新提交,包含所有文件
git commit -m "添加了用户管理功能和相关配置"

注意事项

⚠️ 重要警告

  • 只在本地仓库使用,不要对已经推送到远程的提交使用 reset
  • 如果已经推送,其他开发者可能已经基于该提交进行开发
  • 软重置后,所有文件都会回到暂存区状态

其他重置模式对比

git reset --soft HEAD^   # 只移动HEAD,保留暂存区和工作区
git reset --mixed HEAD^  # 移动HEAD,清空暂存区,保留工作区(默认模式)
git reset --hard HEAD^   # 移动HEAD,清空暂存区和工作区(危险!)

git stash

基本概念

git stash 是 Git 提供的一个临时保存工作进度的功能。它可以把当前工作区和暂存区的修改保存到一个栈中,让你能够快速切换到其他分支或处理紧急任务。

主要用途

  • 临时保存未完成的工作
  • 快速切换分支处理紧急问题
  • 清理工作区以便拉取最新代码
  • 实验性修改的临时保存

常用命令详解

1. 基本保存和恢复

# 保存当前工作(包括工作区和暂存区的修改)
git stash
# 或者添加描述信息
git stash push -m "正在开发登录功能"

# 查看所有 stash
git stash list
# stash@{0}: On main: 正在开发登录功能
# stash@{1}: WIP on main: abc1234 修复了一个bug

# 恢复最近的 stash
git stash pop

# 或者恢复指定的 stash
git stash pop stash@{1}

2. 高级用法

# 只保存工作区修改,不包括暂存区
git stash push --keep-index

# 包括未跟踪的文件
git stash push --include-untracked
# 简写
git stash push -u

# 包括被忽略的文件(慎用)
git stash push --all

# 交互式选择要 stash 的内容
git stash push --patch

3. 查看和管理 stash

# 查看 stash 列表
git stash list

# 查看某个 stash 的内容
git stash show stash@{0}

# 查看详细的差异
git stash show -p stash@{0}

# 应用 stash 但不删除它
git stash apply stash@{0}

# 删除特定的 stash
git stash drop stash@{0}

# 清空所有 stash
git stash clear

4. 从 stash 创建分支

# 从 stash 创建新分支(当 stash 与当前分支有冲突时很有用)
git stash branch new-feature-branch stash@{0}

实际使用场景示例

场景一:紧急修复 bug

# 正在开发新功能,代码写了一半
git status
# 显示有很多修改的文件

# 突然需要修复一个紧急 bug,先保存当前工作
git stash push -m "新功能开发进行中"

# 切换到 main 分支修复 bug
git checkout main
git pull origin main

# 修复 bug 并提交
# ... 修复代码 ...
git add .
git commit -m "修复了关键的安全漏洞"
git push origin main

# 回到开发分支,恢复之前的工作
git checkout feature-branch
git stash pop
# 继续开发新功能...

场景二:拉取最新代码前保存工作

# 本地有未提交的修改
git status
# 显示有修改

# 需要拉取远程最新代码
git stash

# 拉取最新代码
git pull origin main

# 恢复本地修改
git stash pop

# 如果有冲突,解决冲突后继续工作

场景三:实验性修改

# 想要尝试一个实验性的修改
git stash push -m "保存稳定版本"

# 进行实验性修改
# ... 各种尝试 ...

# 如果实验失败,恢复到稳定版本
git reset --hard HEAD
git stash pop

# 如果实验成功,可以丢弃 stash
git stash drop stash@{0}

最佳实践

  1. 添加描述信息

    # 好的做法
    git stash push -m "正在开发用户认证模块"
    
    # 不好的做法
    git stash  # 没有描述,以后很难记住内容
  2. 定期清理 stash

    # 定期查看和清理不需要的 stash
    git stash list
    git stash drop stash@{2}  # 删除不需要的 stash
  3. 处理冲突

    # 如果 stash pop 有冲突
    git stash pop
    # 解决冲突后
    git add .
    # 不需要 commit,因为这些修改本来就是工作区的内容
  4. 避免的陷阱

    • 不要在 stash 中保存太久,容易忘记
    • 注意 stash 不会保存新创建但未跟踪的文件(除非使用 -u 参数)
    • stash 是本地的,不会同步到远程仓库

总结

命令功能使用场景
git stash保存当前工作临时切换任务
git stash pop恢复并删除最新的 stash恢复之前的工作
git stash list查看所有 stash管理多个临时保存
git stash apply恢复但不删除 stash在多个分支应用相同修改
git stash drop删除指定 stash清理不需要的保存

组合使用技巧

技巧一:完善提交前的最后检查

# 1. 先 stash 保存当前所有修改
git stash push -m "准备提交前的完整修改"

# 2. 逐步恢复和提交,确保每个提交都是原子性的
git stash pop
# 选择性添加文件到暂存区
git add file1.js file2.css
git commit -m "添加了前端验证逻辑"

# 继续处理剩余文件...

技巧二:修复提交历史

# 1. 如果最近几次提交都有问题,可以组合使用
git stash  # 先保存当前工作

# 2. 重置到几次提交之前
git reset --soft HEAD~3

# 3. 重新组织提交
git commit -m "重构了用户管理模块"

# 4. 恢复之前保存的工作
git stash pop

记住:Git 是一个强大的工具,但也要谨慎使用。在进行任何可能影响历史记录的操作前,最好先备份或确保了解操作的后果。

无标签
评论区
头像
文章目录