想象一下这种情况:您正在开发一项需要处理大量文件的功能,并且已经完成了很多工作,而没有完成很多工作(例如调试代码,临时注释,请您自己记住)执行/撤消某些操作,并且不要忘记添加您还没有时间添加的位),然后您会看到必须进行的简单的单行更改,但这属于其自己的提交。
有什么方法可以简单地提交它,而不必将所有内容都从您精心添加的登台区域中拉出来,也不会藏起来(并且可能失去对登台和不登台的谨慎选择)和 just提交那一行?
我意识到摆弄multiple staging areas可能会实现这一点,但是我希望有个比这更简单的解决方案。允许我跳过暂存区域的某些开关比使用GIT_INDEX_FILE
来拥有其中两个要方便得多。
我理想的解决方案是这样的:
git commit --skip-stage --patch ./app/models/whatever.rb
如果这是不可能,那么我将在回弹时简单地藏起来并使用--index
,希望我不会在藏起和弹出之间意外地做一些破坏能力的事情干净地恢复索引。
因为我知道有人会想知道“如果您知道--index
与git stash pop
,为什么要问这个问题?因为与我使用Git所做的事情一样,这同样重要仅仅是解决一个实际问题,并不意味着它是最好的解决方案,也不是一个人应该停止寻找替代方案,这不仅适用于Git,而且适用于整个人生。
答案 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从工作树中复制file1
和file2
到这个新的临时索引中,就像git add file1 file2
一样。因此,现在该临时索引与HEAD
匹配,除了两个命名文件之外。
Git还通过复制当前索引内容(即暂存文件)来创建.git/index.lock
。与以前一样,Git会复制file1
和file2
到这个临时索引中。因此,与第一个索引不同的这个临时索引具有您所有暂存的文件,除了file1
和file2
从工作树中被覆盖之外。
现在,Git使用 first 临时索引(除了两个文件之外,大多数都与HEAD
匹配的临时索引)进行新提交。如果此提交成功,Git会照常更新当前分支,然后删除该第一个临时索引,并通过将 second 临时索引.git/index.lock
重命名为来解锁并更新实/常规索引。 .git/index
。因此,现在普通索引就是除了之前file1
和file2
被替换为git add file1 file2
之前的样子。
如果您已经精心上演file1
和/或file2
的不同版本,(当然)这些版本现在不在您的工作树中,因为工作树版本是您要使用--only
提交的版本-特殊版本是 gone ,已通过git add
步骤删除。如果没有,这可能就是您想要的!
git commit --include file3
在这里,我们假设您git add
已经file1
更早了-file1
的版本可能与现在的工作树略有不同,因此实/常规索引中的file1
与file1
中的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
。
(此模式不会破坏任何经过精心安排的文件,但也不会执行您在问题中描述的内容。)