阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 储藏更改(git stash)

储藏更改(git stash)

作者:陈川 阅读数:51189人阅读 分类: 开发工具

什么是 git stash

git stash 是 Git 提供的一个实用命令,它允许开发者临时保存当前工作目录和暂存区的修改,而无需提交这些更改。这个功能特别适用于需要快速切换分支但又不想提交未完成工作的情况。

当执行 git stash 命令时,Git 会:

  1. 保存工作目录中的所有已跟踪文件的修改
  2. 保存暂存区中的更改
  3. 将工作区和暂存区恢复到最近一次提交的状态

基本用法

最简单的 stash 命令不需要任何参数:

git stash

这会创建一个新的 stash 条目,并将工作区和暂存区恢复到干净状态。Git 会自动为每个 stash 条目生成一个描述信息,如 WIP on master: 5d2f3e5 Initial commit

如果想添加自定义消息以便更好地识别 stash 内容,可以使用:

git stash save "正在开发登录功能"

查看 stash 列表

要查看当前所有的 stash 条目,使用:

git stash list

输出类似于:

stash@{0}: On master: 正在开发登录功能
stash@{1}: WIP on feature-branch: 8a7d6f5 添加用户模型

每个 stash 条目都有一个索引(如 stash@{0})和关联的描述信息。

恢复 stash

有几种方法可以恢复 stash 的内容:

  1. 恢复最新的 stash 并保留它在 stash 列表中:

    git stash apply
    
  2. 恢复指定的 stash(通过索引):

    git stash apply stash@{1}
    
  3. 恢复最新的 stash 并从 stash 列表中删除它:

    git stash pop
    

删除 stash

如果不再需要某些 stash 条目,可以删除它们:

  1. 删除最新的 stash:

    git stash drop
    
  2. 删除指定的 stash:

    git stash drop stash@{1}
    
  3. 删除所有 stash:

    git stash clear
    

高级用法

只 stash 未暂存的更改

默认情况下,git stash 会保存工作区和暂存区的所有更改。如果只想 stash 工作区的更改(不包括暂存区的更改),可以使用:

git stash save --keep-index

包含未跟踪文件

默认情况下,git stash 不会保存未跟踪的文件。要包含未跟踪文件,使用:

git stash save --include-untracked

或者简写:

git stash -u

创建分支并应用 stash

有时直接应用 stash 可能会导致冲突。这时可以基于 stash 创建一个新分支:

git stash branch new-branch-name stash@{1}

这会:

  1. 基于 stash 创建时的提交创建一个新分支
  2. 切换到该分支
  3. 应用 stash 的更改
  4. 如果成功应用,则删除该 stash

实际应用示例

假设我们正在开发一个前端项目,突然需要修复一个紧急 bug:

  1. 当前正在修改登录页面:

    // login.js
    function handleLogin() {
      // 正在开发的新功能
      const rememberMe = document.getElementById('remember').checked;
      // 未完成的代码...
    }
    
  2. 需要暂存当前工作:

    git stash save "登录页面记住我功能"
    
  3. 切换到修复分支:

    git checkout -b hotfix/1234
    
  4. 修复 bug 并提交后,切换回原分支:

    git checkout feature/login
    
  5. 恢复之前的工作:

    git stash pop
    

解决 stash 冲突

当应用 stash 时,如果与当前工作区的修改有冲突,Git 会标记冲突文件。这时需要手动解决冲突:

  1. 打开冲突文件,会看到类似内容:

    <<<<<<< Updated upstream
      const user = await getUser();
    =======
      const user = getCachedUser() || await getUser();
    >>>>>>> Stashed changes
    
  2. 手动解决冲突后,标记为已解决:

    git add conflicted-file.js
    
  3. 继续应用 stash 的其他修改(如果有):

    git stash apply --index
    

查看 stash 内容差异

在应用 stash 前,可以先查看它的内容:

git stash show -p stash@{1}

这会显示该 stash 与创建时的提交之间的差异。

使用场景总结

  1. 临时保存未完成的工作以切换分支
  2. 尝试不同的实现方式前保存当前状态
  3. 将当前修改与远程分支同步前清理工作区
  4. 保存实验性代码而不创建不完整的提交

与其他命令结合

git stash 可以与其他 Git 命令结合使用:

# 暂存当前修改,拉取远程更新,然后恢复修改
git stash
git pull
git stash pop

# 暂存当前修改,重置到某个提交,然后恢复修改
git stash
git reset --hard HEAD~3
git stash pop

注意事项

  1. stash 是本地存储的,不会推送到远程仓库
  2. 过于频繁使用 stash 可能导致难以管理的 stash 列表
  3. 长期不清理的 stash 可能难以回忆其内容
  4. 重要修改最好还是通过常规提交保存
  5. 使用描述性消息有助于后期识别 stash 内容

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌