Git 指南
Git add -p:暂存特定行并进行集中提交
两个不相关的更改最终出现在一个文件中。现在就提交修复,稍后再进行重构:关于暂存区域、补丁模式和 GitTree 行选择的实用指南。
要仅提交文件的一部分,请使用 `git add -p -- path/to/file` 暂存所需的更改,使用 `git diff --cached` 进行审核,然后提交。 其余编辑保留在您的工作文件中。在 GitTree 中,打开文件 diff,选择更改的行,然后选择 Stage Lines 以准备相同类型的集中提交。
假设您修复了结账验证错误,然后开始重新组织同一组件。审阅者应该能够在不阅读未完成的重构的情况下理解错误修复。本指南在这些更改成为历史之前将其分开。该动画示例使用 GitTree,即我们为 macOS、Windows 和 Linux 制作的客户端。部分分期属于免费计划;当前的官方版本需要登录。
工作树、暂存区和提交:保存什么?
| 地点 | 它包含什么 | 如何检查 |
|---|---|---|
| 工作树 | 您的文件现在的样子 | 在编辑器中打开文件 |
| 索引/暂存区 | 提议的下一个快照 | git diff --cached 将其与 HEAD 进行比较 |
| 头 | 当前提交 | git show HEAD:path/to/file |
暂存是一个选择步骤,不是提交,也不是推送。文件可以部分暂存:索引保存一个版本,而编辑器显示所有编辑。如果您在暂存后再次编辑,暂存版本不会静默更新。提交之前再检查一遍。 可视化提交图有助于检查提交存在后的历史记录。
如何在一个文件上使用 git add -p
从 git status 开始并检查已上演的所有内容。补丁模式将选定的更改添加到现有索引;它不会删除之前的选择。在此示例中,将 src/checkout.ts 替换为您跟踪的文本文件,然后在 Git 询问每个块时仅接受验证修复。
git status
git diff --cached
git diff -- src/checkout.ts
git add -p -- src/checkout.ts
git diff --cached
git diff -- src/checkout.ts
git commit -m "fix: validate checkout input"仅在检查分阶段差异并测试预期更改后才运行最终提交。 git diff --cached 显示提交将记录的内容; plain git diff 显示未提交的内容。请勿在此工作流程中使用 git commit -a 或向 git commit 提供文件路径:这些表单可能会绕过您刚刚准备的部分选择。
当修复和重构紧密结合时,拆分大块
块是附近带有上下文的已更改行的块。补丁模式可以将修复和重构组合在一起。使用 s 要求 Git 分割块。如果编辑无法自动分隔,则 e 打开补丁编辑器,或者可视线选择器可以帮助您选择预期的添加和删除。
| 钥匙 | 决定 |
|---|---|
y | 暂存此块 |
n | 将此块保留为未暂存状态 |
s | 尽可能将其分成更小的块 |
e | 编辑建议的补丁 |
q | 停止审查剩余的块 |
对于替换,请将已删除的行及其替换视为一个逻辑更改。仅选择一半可能会生成您在编辑器中从未见过的代码。高级补丁编辑可选;如果您无法解释暂存的结果,请取消暂存并选择更清晰的边界。集中的提交需要独立发挥作用,而不仅仅是小规模的提交。
如何在 GitTree 中暂存特定行
打开更改后的文件
选择 // WIP 行,然后选择 Unstaged Files 下的文件以打开其差异。
选择合适的金额
将 Stage Hunk 用于完整的块,或勾选更改的行旁边的框。按住 Shift 键并单击选择一个范围。
暂存选定的行
在选择栏中选择 Stage Lines。其他编辑保留在您的工作文件中。
检查暂存版本
选择暂存文件下的文件并查看差异。使用 Unstage Hunk 或 Unstage Lines 来更正选择。
做出一项连贯的改变
编写一条消息来描述所选更改并提交。返回到下一次提交的剩余编辑。

下载 GitTree 以直观地查看混合差异并构建重点提交。您可以在终端旁边的现有存储库上使用它;两者都读取相同的 Git 暂存区。
取消暂存更改而不放弃您的编辑
git restore --staged -- src/checkout.ts
# Or choose which staged blocks to remove:
git restore --staged -p -- src/checkout.ts这些是替代命令。使用 --staged,恢复会更改索引而不是您的工作文件。对于具有提交的存储库,它通常会将暂存内容重置为 HEAD。如果没有 --staged,恢复可能会覆盖正在进行的编辑,因此请保持清晰的区别。当您只想更改下一次提交包含的内容时,在 GitTree 中选择 Unstage,而不是 Discard。
为什么一个文件出现两次,或者一行无法暂存
暂存文件和未暂存文件下的文件通常意味着部分暂存或稍后编辑,而不是重复文件。新的、未跟踪的文本文件可能需要 git add -N -- path/to/new-file,修补模式才能提供其内容。二进制文件没有普通的文本块; GitTree 还将重命名、LFS 指针和子模块更改作为整个文件操作进行阶段。如果隐藏了空白,请在选择仅空白更改之前显示它。
如果编辑器或格式化程序在您打开其差异后更改了文件,则 GitTree 可能会拒绝过时的行选择。刷新 diff 并再次选择。避免仅仅为了达到更小的行数而分割紧密耦合的更改。对于任务中断,隐藏未完成的工作;对于已经提交的混合历史记录,请查看交互式变基指南。
测试您正在准备的提交,而不仅仅是编辑器的文件
您的正常测试命令针对工作文件运行,其中仍然包括未暂存的编辑。通过那里的测试并不能证明部分提交已完成。对于重要的拆分,进行第一次本地提交,然后在单独的干净签出或工作树中检查和测试已提交的快照。如果在共享分支之前失败,请添加缺少的依赖项。 worktree 指南 解释了单独的文件夹如何帮助将这些版本分开。
常见问题
git add -p 的作用是什么?
它允许您选择要添加到索引的未暂存更改块。它不会创建提交或上传您的工作。
我可以只提交文件的几行吗?
是的。暂存这些更改,检查 git diff --cached 并在不带 -a 或文件路径参数的情况下提交。其他编辑尚未提交。
取消暂存会删除我的编辑吗?
使用 git Restore --staged 取消暂存会更改索引并保留工作文件。丢弃或恢复工作文件是不同的操作。
为什么 Git 不能分割我的块?
附近的编辑可能没有包含足够的未更改上下文来自动拆分。手动检查补丁或使用行选择,将相关的添加和删除保持在一起。
GitTree 的部分演出免费吗?
是的。文件、块和行暂存都在免费计划中,包括私人存储库。当前的官方版本需要登录。
来源
有关其他产品的声明已根据其位于 2026年10月28日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。