我经常遇到以下情况:
git commit
的修改。git commit -a --amend
(或git commit --amend path/to/A
)现在,因为我只因为我已经建造的最后一次修改的文件A,我希望只有一个文件被重建,但我总是看到的是,所有的A,B和C(即,所有的文件由整个触摸提交)被重建。
这在我看来,它git commit --amend
touch
ing /碰撞每个A,B和C的最后修改的时戳,即使我只添加到提交的修改。
这是必要的吗?能不能避免的,所以只有被触摸,只有得到重建?
如果它的事项,我的项目是在C ++和我的编译系统的cmake +忍者,但我认为这在很大程度上是除了点作为它是相当标准的编译系统依靠最后修改时间戳来确定重建的。
git commit
不碰你的工作树中的任何文件。不要紧,你是否在这里使用--amend
。
没有git commit
一个-a
不使用来自你的工作树的文件要么,但git commit -a
已经Git的,实际上,第一次运行git add -u
,这将在以它们复制到索引读取工作树的一些文件。然后,无论哪种方式,有或没有-a
-git commit
建立从无论是在索引中的新承诺。
新的承诺,一旦做出,有一些新的,独特的,从来没有见过的,之前的哈希ID。如果你正在做一个正常的git commit
(不--amend
),你有一些一系列提交你的资料库,每一个都有自己独特的哈希ID,最后一次这种承诺有一些哈希ID H
:
... <-F <-G <-H <-- your-branch (HEAD)
(在这里,大写字母站在了实际的原始散列的ID,这看起来是随机的,但真的不是,但也是不可预测的。)新的承诺获得其新的独特的哈希ID I
了,里面I
,存储父散列ID是H
。 Git的写入新的ID到分支名,赠送:
...--F--G--H--I <-- your-branch (HEAD)
随着--amend
,所不同的是,而不是有新的犯下I
重新指向现有的承诺H
,Git的构建与H
了,在这种情况下G
同一母公司的新承诺。其效果是,H
被猛在一旁:
H
/
...--F--G--I <-- your-branch (HEAD)
现有的承诺H
是不变的,但它似乎消失:它由开始I
和向后工作不容易找到。所以git log
隐藏它,它似乎消失了,仿佛混帐莫名其妙地改变H
。 Git有没有; H
仍完好无损。这也是默认情况下为至少30天仍可恢复,作为散列ID存储在什么混帐调用reflogs。但它看起来走了。
如果您看到各种文件得到重建,这并不是因为本身的Git感动的源文件。有些东西可能已经触及了源文件,或者,我的猜测,但只是一种猜测,构建系统可以将其标记为依赖于特定的Git提交哈希:因为I
有不同的哈希比H
,并构建伪影的结果的H
不I
,他们现在已经过时了。
(其他可能性包括改变文件的时间戳,当然Git的挂钩。)
避免(手动)的一种方法是做所有的提交没有修改,当你与变化做,rebase interactively压垮提交(你现在修改的)