Git Stash 深入:只暂存你需要的文件
在日常的 Git 工作流中,git stash 是一个极其有用的命令。它允许我们暂时保存当前工作目录中那些尚未提交的修改,以便我们可以切换到另一个分支、修复一个紧急 bug 或者执行其他操作,而无需提交那些不完整的代码。完成任务后,我们可以再将这些修改恢复回来。
然而,git stash 默认的行为是将所有未跟踪、已修改但未暂存,以及已暂存的更改一并保存。这在很多情况下是方便的,但在另一些场景中,我们可能只希望暂存工作目录中的一部分文件或一部分修改,而保留其他内容在工作区继续编辑。例如:
- 你正在开发一个复杂的功能,涉及多个文件。
- 突然,一个紧急 bug 报告进来,需要你在当前分支(或切换到其他分支)立即修复。
- 你有一些已修改的文件,与这个紧急 bug 无关,你不想提交它们,也不想把它们全部
stash掉,因为你还想继续编辑其中的一部分。
在这种情况下,标准的 git stash 就不够灵活了。幸运的是,Git 提供了更精细的控制方式,允许我们只暂存你需要的文件或修改。
1. 交互式暂存:git stash push --patch (或 git stash -p)
这是最强大和最常用的选择性暂存方法。它允许你像使用 git add -p 或 git checkout -p 一样,在每个修改块 (hunk) 的基础上决定是否要暂存。
如何使用:
- 确保你的工作目录有未提交的修改。
- 运行命令:
git stash push --patch(或简写为git stash -p)
Git 会遍历你所有已修改的文件,并逐个展示每个修改块(hunk)。对于每个 hunk,Git 会提示你进行选择:
Stash this hunk [y,n,q,a,d,e,?]?
y:暂存这个 hunk。n:不暂存这个 hunk。q:退出(不暂存任何剩余的 hunk)。a:暂存这个文件中的所有剩余 hunk。d:不暂存这个文件中的所有剩余 hunk。e:手动编辑 hunk。这会打开一个编辑器,你可以精确地选择要暂存的行。?:显示帮助信息。
通过这种交互式的方式,你可以非常精确地控制哪些代码行被 stash 起来,哪些保留在工作目录中。这对于将一个大功能的修改拆分为多个逻辑单元进行暂存特别有用。
示例:
假设 file.js 中有两处不相关的修改。运行 git stash -p 后,Git 会逐个展示这些修改,你可以选择只 stash 其中一个,而另一个保留。
2. 暂存指定文件:git stash push <file> (或 git stash -- <pathspec>...)
如果你知道你只想要暂存一个或几个完整的文件,而不是它们的某些部分,那么你可以直接指定文件路径。
如何使用:
- 运行命令:
git stash push <file1> <file2> ...
这会将指定文件中的所有修改(包括已暂存和未暂存的)暂存起来,而其他未指定文件的修改则会保留在工作目录中。
示例:
bash
git stash push src/components/MyComponent.js
这将只暂存 src/components/MyComponent.js 文件中的所有修改。
注意事项:
- 如果你想暂存一个包含空格的文件名,需要用引号将其括起来,例如:
git stash push "my file with spaces.js"。 - 这个命令不能像
-p那样精确到 hunk。它会暂存整个文件的所有修改。
3. 暂存已暂存的修改 (Staged Changes):git stash push --staged (或 git stash -s)
这个选项比较特殊。它不是选择性地暂存文件,而是只暂存那些已经被 git add 到暂存区(index)的修改。未暂存的修改将保留在工作目录中。
如何使用:
- 你有一些修改,并用
git add将其中一部分加入了暂存区。 - 运行命令:
git stash push --staged(或git stash -s)
这对于你已经精心准备好了一部分修改,打算提交,但又临时需要处理其他事情时很有用。你可以只 stash 掉这些已暂存的修改,稍后再恢复并提交,而工作目录中未暂存的部分则不受影响。
示例:
“`bash
修改 file1.js 和 file2.js
将 file1.js 加入暂存区
git add file1.js
暂存所有已暂存的修改(即 file1.js 的修改)
git stash push –staged
“`
此时,file1.js 的修改会被 stash 起来,而 file2.js 的修改会继续留在工作目录中。
总结
通过掌握 git stash 的这些高级用法,你可以更灵活、更精确地管理你的工作区状态。
- 当你需要精确控制到每个修改块时,使用
git stash push --patch。 - 当你需要暂存一个或几个完整文件时,使用
git stash push <file>...。 - 当你需要只暂存已添加到暂存区的修改时,使用
git stash push --staged。
这些技巧可以帮助你保持一个干净、有序的工作区,提高开发效率,并减少在处理紧急任务时的干扰。在下一次遇到需要选择性暂存的场景时,不妨尝试一下这些强大的 git stash 选项。
—I have provided the article. Is there anything else I can help you with?