Git - 暂存操作
Git Stash 操作
Section titled “Git Stash 操作”想象一下你正在开发一个新功能,你的代码处于中间的、尚未提交的状态。突然,另一个分支上急需修复一个紧急 bug。你无法提交你尚未完成的工作,也不想丢失你的更改。这时 git stash 就派上用场了。
git stash 命令会获取你修改过的已跟踪文件和暂存的更改,将它们保存在一个临时存储区域(“暂存栈”),并将你的工作目录恢复到上次提交(HEAD)的状态。这使你可以在不提交未完成更改的情况下切换分支或处理其他事情。
假设 Jerry 正在修改 string_utils.c:
[jerry@devbox project]$ git status -s M string_utils.c?? new_temp_file.txtstring_utils.c 是已跟踪并已修改的。new_temp_file.txt 是未跟踪的。默认情况下,git stash 只暂存对已跟踪文件的更改。要包含未跟踪文件,请使用 git stash -u 或 git stash --include-untracked。要同时暂存暂存的更改,git stash 会自动包含它们。
Jerry 需要切换分支来处理紧急任务,但他不想提交当前的工作。他暂存了他的更改:
[jerry@devbox project]$ git stash push -m "进行中: 新的字符串解析功能"(使用 git stash push -m "message" 是一种现代的方式,可以暂存并附带描述性消息。单独使用 git stash 也有效。)
Saved working directory and index state On main: 进行中: 新的字符串解析功能HEAD is now at jkl3456 Implement my_strcpy function and add test现在,Jerry 的工作目录是干净的(与 HEAD 提交匹配)。修改过的 string_utils.c 已被还原,如果他使用了 -u,new_temp_file.txt 也将从工作目录中消失(但保存在暂存中)。
[jerry@devbox project]$ git status -s(如果 new_temp_file.txt 未使用 -u 暂存,它仍然会显示为 ?? new_temp_file.txt)
Jerry 现在可以安全地切换分支了。要查看暂存更改的列表,他使用 git stash list:
[jerry@devbox project]$ git stash liststash@{0}: On main: 进行中: 新的字符串解析功能完成紧急任务并返回到他的特性分支(或本例中的 main)后,Jerry 希望重新应用他暂存的更改。他使用 git stash pop:
[jerry@devbox project]$ git stash popgit stash pop 重新应用最近的暂存(stash@{0}),如果成功,则将其从暂存栈中移除。输出将显示重新应用的更改:
On branch main你的分支与 'origin/main' 一致。
未暂存以待提交的更改: (使用 "git add <file>..." 来更新要提交的内容) (使用 "git restore <file>..." 来丢弃工作目录中的更改) 已修改: string_utils.c
未跟踪的文件: (使用 "git add <file>..." 来包含在要提交的内容中) new_temp_file.txt(如果使用了 -u 暂存并已恢复)
未添加任何要提交的更改(使用 "git add" 和/或 "git commit -a")已丢弃 refs/stash@{0} (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)他的工作目录现在回到了暂存之前的状态。
[jerry@devbox project]$ git status -s M string_utils.c?? new_temp_file.txt(如果已恢复)如果 git stash pop 遇到冲突,它会重新应用更改但不会丢弃暂存,允许你解决冲突后再手动执行 git stash drop stash@{0}。或者,git stash apply 会重新应用暂存但将其保留在栈上,如果你想将同一个暂存应用到多个分支,这会很有用。