暂存区的目的是为提交提供一个灵活的空间。我认为,如果将git与集中化的版本控制系统(例如Subversion)进行对比,这将变得更加清晰。
颠覆
在Subversion中,您可以选择提交工作副本的某些文件。但是只有完整的文件。现在:如果您要暂存file A
而不是file B
,并且暂存与file C
相关的文件A
部分,而不是依赖于文件更改的部分,那该怎么办B
(因为那样您将存在提交一致性问题)。
吉特
Git通过提供暂存作为第二个工作副本来解决此问题。在暂存区域中,您将整理要提交的快照(大致而言)。
因此,您可以在暂存区域中创建一个快照,其中包括对的更改A
以及C
仅反映的更改的文件版本A
。
对于具体问题
一般提交策略:粒度提交
我认为在谈论“我应该何时上演”这个问题时,还应该谈论承诺习惯。
集中式VCS
在您提交到中央服务器的集中式版本控制系统中,对于您的同事来说,您的提交是完整且经过良好测试的,这一点很重要。因此,人们会尝试不经常提交,然后提交完整文件的状态,以最大程度地减少错误的可能性。因此,提交往往是相当大的块,其中包含很多更改(如果它们不是简单的修复程序)。提交中的更改可能完全不相关。
吉特
在Git中,提交是在本地执行的,只有将它们推送到服务器才能使其公开。因此,从某种意义上讲,提交是廉价的。颠覆意义上的提交与git commit
后跟的多个提交相当git push
。这种差异很重要。
即使您在同一文件中更改了其他行,Git也允许您提交一行代码。这给您带来很多好处,因为例如您可以在第100行中提交安全错误修正,同时更改第300-350行以引入新功能。
- 您可以在不同的提交中分开不同的更改。这样可以在您的版本历史记录中很好地将它们分开,甚至还可以还原其中一个而不是另一个。
- 您的提交不一定必须反映工作副本的“编译”状态(尽管我尝试保持这种状态)。
那么,Subversion用户期望的提交中的“质量控制”和构建保证在哪里?它已转移到git中的其他动作。您仍然希望在公共存储库中推出程序的运行状态。因此,在推出更改之前,请确保测试成功并且程序可以运行。
另外,尝试最大程度地利用分支机构。提交许多小的更改时,您将获得相当大的版本历史记录。如果您在分支机构工作,则可以按分支机构名称对这些细粒度的提交进行分类,然后将它们合并回去(选项--no-ff
还将保留这些功能,这些特征驻留在唯一的分支机构中)。
也就是说master
,如果分支处于良好状态,则只能保持合并到分支的习惯。您还可以使用标签来跟踪里程碑和发布。
现在回到阶段:在每次提交中提交几行后,将在提交之前直接上演。(至少我是这样做的)。
git diff
和git diff --cached
好,但有时我想要更多)。