是'git的承诺--amend`触碰的文件超过必要吗?

问题描述 投票:1回答:2

我经常遇到以下情况:

  1. 修改文件A,B和C.
  2. 提交与git commit的修改。
  3. 生成项目,所以构建是最新的。
  4. 做一个后续/固定式的修改提交一份只。
  5. 运行git commit -a --amend(或git commit --amend path/to/A
  6. 逐步重建该项目。

现在,因为我只因为我已经建造的最后一次修改的文件A,我希望只有一个文件被重建,但我总是看到的是,所有的A,B和C(即,所有的文件由整个触摸提交)被重建。

这在我看来,它git commit --amend touching /碰撞每个A,B和C的最后修改的时戳,即使我只添加到提交的修改。

这是必要的吗?能不能避免的,所以只有被触摸,只有得到重建?

如果它的事项,我的项目是在C ++和我的编译系统的cmake +忍者,但我认为这在很大程度上是除了点作为它是相当标准的编译系统依靠最后修改时间戳来确定重建的。

git git-commit build-system amend
2个回答
1
投票

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,并构建伪影的结果的HI,他们现在已经过时了。

(其他可能性包括改变文件的时间戳,当然Git的挂钩。)


0
投票

避免(手动)的一种方法是做所有的提交没有修改,当你与变化做,rebase interactively压垮提交(你现在修改的)

© www.soinside.com 2019 - 2024. All rights reserved.