Git 储藏(Stash)教程

Git储藏更改(Stash)

掌握临时保存更改、清理工作区和高效切换分支的核心技巧

开始学习

什么是Git储藏(Stash)?

工作目录

未提交的更改

修改的文件
储藏栈

临时存储区

安全保存更改

储藏的概念

Git储藏(Stash)允许你临时保存工作目录和暂存区的更改,而不需要提交它们。这让你可以清理工作区,切换到其他分支,然后再恢复这些更改。

  • 临时保存未提交的更改
  • 清理工作目录而不丢失进度
  • 安全地切换分支
  • 处理紧急任务而不中断当前工作

储藏栈

Git使用栈(Stack)数据结构来管理储藏。每个储藏都被压入栈中,你可以应用、弹出或删除栈中的储藏。

  • 后进先出(LIFO)结构
  • 每个储藏都有唯一的标识符
  • 可以存储多个储藏
  • 可以按需应用特定储藏

储藏的用途

  • 切换分支:保存当前工作以切换到其他分支
  • 处理紧急任务:临时保存工作以处理优先级更高的任务
  • 清理工作区:临时移除更改以测试干净的工作目录
  • 保存实验性更改:保存不确定是否要提交的更改
  • 合并前准备:在合并前保存本地更改

注意: 储藏只保存已跟踪文件的更改。默认情况下,未跟踪文件和忽略的文件不会被储藏。可以使用git stash -u来包含未跟踪文件。

储藏命令大全

基本储藏
git stash

储藏工作目录和暂存区的更改

带消息储藏
git stash save "消息"

储藏并添加描述性消息

查看储藏列表
git stash list

显示所有储藏的列表

应用最新储藏
git stash apply

应用最新储藏,保留储藏

应用并删除
git stash pop

应用最新储藏并从栈中删除

删除储藏
git stash drop

删除最新储藏

高级储藏命令

  • git stash -u

    包含未跟踪文件

  • git stash -a

    包含所有文件(包括忽略的文件)

  • git stash --keep-index

    储藏但不包括已暂存的更改

  • git stash show stash@{0}

    显示特定储藏的更改

  • git stash branch new-branch

    从储藏创建新分支

储藏管理命令

  • git stash apply stash@{1}

    应用特定储藏(不删除)

  • git stash pop stash@{2}

    应用并删除特定储藏

  • git stash drop stash@{3}

    删除特定储藏

  • git stash clear

    删除所有储藏

  • git stash show -p

    显示储藏的详细差异

提示: 使用git stash save "描述性消息"为储藏添加有意义的描述,这样在查看储藏列表时更容易识别每个储藏的内容。

储藏工作流程

1. 进行更改

在工作目录中编辑文件

2. 储藏更改

git stash save "描述"

3. 切换分支

处理其他任务

4. 恢复更改

git stash pop

详细工作流程示例

# 1. 在当前分支进行一些更改
echo "新功能代码" >> feature.py
git add feature.py

# 2. 发现需要紧急修复另一个分支的bug
# 储藏当前更改以便切换到其他分支
git stash save "新功能开发中"

# 3. 工作目录现在干净了,可以安全切换分支
git checkout main

# 4. 修复紧急bug并提交
echo "修复bug" >> bugfix.py
git add bugfix.py
git commit -m "修复紧急bug"

# 5. 切换回功能分支
git checkout feature-branch

# 6. 恢复之前储藏的更改
git stash pop

# 7. 继续之前的工作

储藏状态检查

在储藏操作前后检查状态:

# 储藏前检查状态
git status
# 输出: 有未提交的更改

# 执行储藏
git stash

# 储藏后检查状态
git status
# 输出: 工作目录干净

# 查看储藏列表
git stash list
# 输出: stash@{0}: WIP on feature-branch: abc123 初始提交

# 查看特定储藏的详细内容
git stash show stash@{0} -p

注意: 使用git stash show -p可以查看储藏的详细差异,这在决定是否要应用某个储藏时非常有用。

常见使用场景

紧急分支切换

当你在一个分支上工作时,需要立即切换到另一个分支处理紧急任务。

git stash
git checkout other-branch
# 处理紧急任务...
git checkout original-branch
git stash pop
拉取远程更新

在拉取远程更新前储藏本地更改,避免合并冲突。

git stash
git pull origin main
git stash pop
# 解决可能的冲突
测试干净环境

临时移除本地更改以测试干净的工作目录。

git stash
# 运行测试...
git stash pop
保存实验性代码

保存不确定是否要提交的实验性更改。

# 进行一些实验性更改
git stash save "实验性功能A"
# 如果决定保留:git stash pop
# 如果决定放弃:git stash drop
应用储藏到不同分支

将一个分支的更改应用到另一个分支。

# 在分支A储藏更改
git stash save "分支A的更改"
git checkout branch-B
git stash apply
部分文件储藏

只储藏特定文件的更改。

# 只储藏特定文件
git stash push file1.txt file2.txt
# 或者交互式选择要储藏的文件
git stash -p

储藏与分支切换的最佳实践

  1. 在切换分支前总是检查工作目录状态
  2. 如果有未提交的更改,使用git stash
  3. 为储藏添加描述性消息以便识别
  4. 完成任务后及时恢复储藏
  5. 定期清理不再需要的储藏

警告: 储藏不会保存未跟踪的文件,除非使用-u-a选项。对于重要的未跟踪文件,最好先提交或备份。

技巧: 使用git stash --keep-index可以在储藏时保留已暂存的更改,这在只想测试暂存更改时很有用。

高级技巧与最佳实践

储藏管理技巧

从储藏创建分支

当应用储藏时出现冲突,可以从储藏创建新分支:

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

这会在应用储藏时创建新分支,避免与当前分支的冲突。

交互式储藏

选择性地储藏特定更改:

git stash -p

这会交互式地询问要储藏哪些更改,类似于git add -p

储藏特定文件

只储藏指定文件的更改:

git stash push -m "只储藏重要文件" important-file.txt

这让你可以精确控制哪些文件被储藏。

解决储藏冲突

当应用储藏时发生冲突的解决方法:

# 尝试应用储藏
git stash apply

# 如果发生冲突,Git会提示:
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 手动解决冲突
# 编辑有冲突的文件...

# 标记冲突已解决
git add file.txt

# 完成应用过程
git stash drop # 如果使用apply而不是pop

储藏最佳实践

  • 使用描述性消息git stash save "修复登录bug"
  • 及时清理:定期删除不再需要的储藏
  • 小心使用poppop会删除储藏,先用apply测试
  • 备份重要更改:对于重要更改,考虑创建临时分支而不是依赖储藏
  • 注意未跟踪文件:记住储藏默认不包含未跟踪文件

专业提示: 可以将储藏命令添加到git别名中,例如git config --global alias.st 'stash',然后使用git st作为git stash的快捷方式。

完整工作流示例

# 场景:在功能分支上工作,需要紧急修复生产bug

# 1. 查看当前状态
git status

# 2. 储藏当前工作(包含未跟踪文件)
git stash -u -m "用户认证功能开发中"

# 3. 切换到生产分支
git checkout production

# 4. 从生产分支创建热修复分支
git checkout -b hotfix/critical-bug

# 5. 修复bug并提交
# ... 修复代码 ...
git add .
git commit -m "修复关键安全漏洞"

# 6. 切换回生产分支并合并修复
git checkout production
git merge hotfix/critical-bug

# 7. 推送到远程
git push origin production

# 8. 删除热修复分支
git branch -d hotfix/critical-bug

# 9. 回到功能分支并恢复工作
git checkout feature-branch
git stash pop

# 10. 继续之前的工作

储藏与相关命令对比

方法 用途 优点 缺点
git stash 临时保存更改 快速、无需提交 不保存未跟踪文件(默认)
git commit 永久保存更改 创建历史记录 需要提交消息,污染历史
临时分支 保存重要工作 更安全,可共享 更复杂,需要推送
手动备份 保存文件副本 完全控制 容易出错,不同步

决策指南: 对于短期、临时的更改使用储藏;对于可能需要回退或共享的重要工作,使用临时分支;对于实验性代码,使用储藏保存进度。