跳过(完整的)临时区域并直接提交文件或补丁?

时间:2019-01-22 23:06:28

标签: git git-commit

想象一下这种情况:您正在开发一项需要处理大量文件的功能,并且已经完成了很多工作,而没有完成很多工作(例如调试代码,临时注释,请您自己记住)执行/撤消某些操作,并且不要忘记添加您还没有时间添加的位),然后您会看到必须进行的简单的单行更改,但这属于其自己的提交。

有什么方法可以简单地提交它,而不必将所有内容都从您精心添加的登台区域中拉出来,也不会藏起来(并且可能失去对登台和不登台的谨慎选择)和 just提交那一行

我意识到摆弄multiple staging areas可能会实现这一点,但是我希望有个比这更简单的解决方案。允许我跳过暂存区域的某些开关比使用GIT_INDEX_FILE来拥有其中两个要方便得多。

我理想的解决方案是这样的:

git commit --skip-stage --patch ./app/models/whatever.rb

如果这是不可能,那么我将在回弹时简单地藏起来并使用--index,希望我不会在藏起和弹出之间意外地做一些破坏能力的事情干净地恢复索引。

因为我知道有人会想知道“如果您知道--indexgit stash pop,为什么要问这个问题?因为与我使用Git所做的事情一样,这同样重要仅仅是解决一个实际问题,并不意味着它是最好的解决方案,也不是一个人应该停止寻找替代方案,这不仅适用于Git,而且适用于整个人生。

1 个答案:

答案 0 :(得分:1)

-a标志,git commit -a--only--include标志(可以缩短为-o-i ),您可以这样做:

git commit --only file1 file2

或:

git commit --include file3

但是这些工作是 创建一个新的临时索引,正如我在对您的链接问题的回答中所概述的那样。

这些操作有些不可思议,可能不是您想要的。特别是,它们创建的临时索引文件包括.git/index.lock,它是Git内部的临时 new 索引,如果提交成功,它将成为 the (常规)索引。这会产生一些非常有力(且有些特殊)的后果。让我们看一下每种操作模式。 --only变体接近您想要的,有时可能您想要的,但有时可能会破坏一些有价值的东西。

git commit --only file1 file2

首先创建一个新的临时索引,该临时索引是从HEAD复制的。 Git从工作树中复制file1file2到这个新的临时索引中,就像git add file1 file2一样。因此,现在该临时索引与HEAD匹配,除了两个命名文件之外。

Git还通过复制当前索引内容(即暂存文件)来创建.git/index.lock。与以前一样,Git会复制file1file2这个临时索引中。因此,与第一个索引不同的这个临时索引具有您所有暂存的文件,除了file1file2从工作树中被覆盖之外。

现在,Git使用 first 临时索引(除了两个文件之外,大多数都与HEAD匹配的临时索引)进行新提交。如果此提交成功,Git会照常更新当前分支,然后删除该第一个临时索引,并通过将 second 临时索引.git/index.lock重命名为来解锁并更新实/常规索引。 .git/index。因此,现在普通索引就是除了之前file1file2被替换为git add file1 file2之前的样子。

如果您已经精心上演file1和/或file2不同版本,(当然)这些版本现在不在您的工作树中,因为工作树版本是您要使用--only提交的版本-特殊版本是 gone ,已通过git add步骤删除。如果没有,这可能就是您想要的!

git commit --include file3

在这里,我们假设您git add已经file1更早了-file1版本可能与现在的工作树略有不同,因此实/常规索引中的file1file1中的HEAD不同。

Git首先创建一个新的名为.git/index.lock的临时索引,该临时索引是从实/常规索引中复制的。然后,Git将file3复制到此临时索引中,就像通过git add file3一样。

现在,Git使用临时.git/index.lock索引进行新提交。如果此提交成功,Git将照常更新当前分支,然后将临时索引从.git/index.lock重命名为.git/index。因此,现在的实/常规索引仍然具有您之前添加的file1(可能与工作树中的file1不匹配,但与旧提交的file1不同),加上您通过file3添加的git commit --include

(此模式不会破坏任何经过精心安排的文件,但也不会执行您在问题中描述的内容。)