Git Stash 深入:只暂存你需要的文件 – wiki基地


Git Stash 深入:只暂存你需要的文件

在日常的 Git 工作流中,git stash 是一个极其有用的命令。它允许我们暂时保存当前工作目录中那些尚未提交的修改,以便我们可以切换到另一个分支、修复一个紧急 bug 或者执行其他操作,而无需提交那些不完整的代码。完成任务后,我们可以再将这些修改恢复回来。

然而,git stash 默认的行为是将所有未跟踪、已修改但未暂存,以及已暂存的更改一并保存。这在很多情况下是方便的,但在另一些场景中,我们可能只希望暂存工作目录中的一部分文件或一部分修改,而保留其他内容在工作区继续编辑。例如:

  • 你正在开发一个复杂的功能,涉及多个文件。
  • 突然,一个紧急 bug 报告进来,需要你在当前分支(或切换到其他分支)立即修复。
  • 你有一些已修改的文件,与这个紧急 bug 无关,你不想提交它们,也不想把它们全部 stash 掉,因为你还想继续编辑其中的一部分。

在这种情况下,标准的 git stash 就不够灵活了。幸运的是,Git 提供了更精细的控制方式,允许我们只暂存你需要的文件或修改。

1. 交互式暂存:git stash push --patch (或 git stash -p)

这是最强大和最常用的选择性暂存方法。它允许你像使用 git add -pgit checkout -p 一样,在每个修改块 (hunk) 的基础上决定是否要暂存。

如何使用:

  1. 确保你的工作目录有未提交的修改。
  2. 运行命令: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>...)

如果你知道你只想要暂存一个或几个完整的文件,而不是它们的某些部分,那么你可以直接指定文件路径。

如何使用:

  1. 运行命令: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)的修改。未暂存的修改将保留在工作目录中。

如何使用:

  1. 你有一些修改,并用 git add 将其中一部分加入了暂存区。
  2. 运行命令: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?

滚动至顶部