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
将默认使用的 。
要创建临时索引,您需要:
创建一个临时索引file(好吧,大多数情况下是file-name,但是你可以复制"该文件的工作树的索引;你不能有一个 空 文件,因为 Git 拒绝它,所以如果你使用 mktemp
来自shell 脚本,您必须删除该文件,或将常规索引复制到它)。
根据需要填充该临时索引:设置环境变量 GIT_INDEX_FILE
以保存该文件的名称,同时使用 git reset
and/or git restore
and/or git add
等等,来调整这个临时索引的内容。 (请注意,您在这里不能 dilly-dally 太多:如果您没有在 14 天内完成所有操作,在此临时索引中所做的更改可能会被 git gc
破坏。这通常适用于所有棘手的 Git hackery,例如使用 git write-tree
和 git commit-tree
.)
使用具有相同 GIT_INDEX_FILE
设置的 git commit
,从临时索引而不是真实索引进行新提交。
对真实索引做点什么:它现在与当前提交.
严重不同步
这里真正困难的部分是第 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 部分。
使用 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
将默认使用的 。
要创建临时索引,您需要:
创建一个临时索引file(好吧,大多数情况下是file-name,但是你可以复制"该文件的工作树的索引;你不能有一个 空 文件,因为 Git 拒绝它,所以如果你使用
mktemp
来自shell 脚本,您必须删除该文件,或将常规索引复制到它)。根据需要填充该临时索引:设置环境变量
GIT_INDEX_FILE
以保存该文件的名称,同时使用git reset
and/orgit restore
and/orgit add
等等,来调整这个临时索引的内容。 (请注意,您在这里不能 dilly-dally 太多:如果您没有在 14 天内完成所有操作,在此临时索引中所做的更改可能会被git gc
破坏。这通常适用于所有棘手的 Git hackery,例如使用git write-tree
和git commit-tree
.)使用具有相同
GIT_INDEX_FILE
设置的git commit
,从临时索引而不是真实索引进行新提交。对真实索引做点什么:它现在与当前提交.
严重不同步
这里真正困难的部分是第 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 部分。