Git CL 相当于 IntelliJ Partial Git Commit

Git CL equivalent to IntelliJ Partial Git Commit

使用 IntelliJ 中的提交工具 window,您可以进行部分 git 提交,这意味着您可以只提交一些有更改的文件,甚至可以提交已更改文件中的某些特定更改块。我熟悉 git 的交互式添加和修补功能,但这些命令会向索引添加更改,之后发出提交将提交整个索引,而不仅仅是修补的结果。然而,IntelliJ 似乎可以以某种方式打补丁,但也只提交选定的更改,忽略 git 索引中可能存在的其他更改,我很想知道 [=14= 的集合] CL 命令可以产生等效的行为。也许像存储索引、取消存储选定的文件、打补丁、提交,然后取消存储其余的存储?有没有更简单的方法来完成这个?

每个 Git 提交 所有文件(加上元数据)的完整快照。这意味着 IntelliJ 要进行 Git 提交,它必须制作完整的快照——因此它必须做与 git add -p 相同的事情。

可以 ,但是,除了 Git 分配给您的标准索引之外,还可以创建一个 临时 索引工作树。请注意,git worktree add 实际上添加了工作树 新索引 for 该工作树。还有一个用于添加工作树的私有 HEAD,还有一些用于二分法的 per-worktree refs 等等;细节变得有点复杂。但总的来说,每个工作树都有一个可区分的索引——“the”索引——这就是 git commit 将默认使用的

要创建临时索引,您需要:

  1. 创建一个临时索引file(好吧,大多数情况下是file-name,但是你可以复制"该文件的工作树的索引;你不能有一个 文件,因为 Git 拒绝它,所以如果你使用 mktemp 来自shell 脚本,您必须删除该文件,或将常规索引复制到它)。

  2. 根据需要填充该临时索引:设置环境变量 GIT_INDEX_FILE 以保存该文件的名称,同时使用 git reset and/or git restore and/or git add 等等,来调整这个临时索引的内容。 (请注意,您在这里不能 dilly-dally 太多:如果您没有在 14 天内完成所有操作,在此临时索引中所做的更改可能会被 git gc 破坏。这通常适用于所有棘手的 Git hackery,例如使用 git write-treegit commit-tree.)

  3. 使用具有相同 GIT_INDEX_FILE 设置的 git commit,从临时索引而不是真实索引进行新提交。

  4. 对真实索引做点什么:它现在与当前提交.

    严重不同步

这里真正困难的部分是第 4 步。您必须弄清楚要做什么,如何做,以及在发生磁盘驱动器 运行ning out 等灾难时如何回滚磁盘 space.

git commit 命令本身有 --only--include 选项,它们在 git commit 期间在内部执行步骤 1 到 4行动。例如,您可以 运行:

git add file1.ext file2.ext
# edit file3, realize you want to commit *just* the file3 changes
git commit --only file3
# go back to working with files 1, 2, adn 3

这有时只涉及两个索引文件——真实的和临时的——有时,为了处理上面提到的第 4 步的复杂情况,涉及制作 三个 个索引文件.一旦 git commit 操作完成(有或没有错误),两个或三个索引文件之一 成为 此 work-tree 的“真实”索引文件。

我不知道 IntelliJ 内部做了什么,但上面涵盖了必须完成的 visible-to-Git 部分。