跳至内容
GitTree

Git 指南

Git add -p:暂存特定行并进行集中提交

两个不相关的更改最终出现在一个文件中。现在就提交修复,稍后再进行重构:关于暂存区域、补丁模式和 GitTree 行选择的实用指南。

撰写者 Kodmora已更新 阅读 1 分钟

要仅提交文件的一部分,请使用 `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 中暂存特定行

  1. 打开更改后的文件

    选择 // WIP 行,然后选择 Unstaged Files 下的文件以打开其差异。

  2. 选择合适的金额

    将 Stage Hunk 用于完整的块,或勾选更改的行旁边的框。按住 Shift 键并单击选择一个范围。

  3. 暂存选定的行

    在选择栏中选择 Stage Lines。其他编辑保留在您的工作文件中。

  4. 检查暂存版本

    选择暂存文件下的文件并查看差异。使用 Unstage Hunk 或 Unstage Lines 来更正选择。

  5. 做出一项连贯的改变

    编写一条消息来描述所选更改并提交。返回到下一次提交的剩余编辑。

观看在 GitTree 中选择并暂存的两条已更改的行。其余的编辑保持未暂存状态。
观看在 GitTree 中选择并暂存的两条已更改的行。其余的编辑保持未暂存状态。GitTree 与演示存储库的接口。

下载 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日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。