Git登台:什么时候登台?如果事后修改该怎么办


9

我对Git广泛领域并不陌生。我已经阅读了该手册并一直在练习,但是我对手册的某些方面感到困惑,在搜索后无法弄清。

我很好奇:

  • 在项目中(首次提交后),何时才是登台源文件的恰当时机?就在提交之前?在添加/删除或修改之后吗?

  • 如果文件在两次提交之间暂存,然后被修改,那么Git会发生什么?它是否需要关注内容声明时的内容更改以及更改后的内容?

  • 如果我创建一个新文件,暂存它然后再删除它,为什么Git要求我使用“ -f”标志,而简单的“ git -rm file.ext”不起作用?

我已经阅读了“阶段意味着什么”以及有关Git的手册和其他教程的其他各个主题,但是正如我所说,我仍然不明白上述问题。

因此,如果可以的话,请用自己的话语和例子回答问题,以便我更好地理解它。

谢谢。


1
每当我完成一些小工作(对于提交来说太小)或不确定一些更改之前,我都会暂存文件。做任何对您有用的事情。找到您展示两个阶段,未分级变化的工具(例如,git的GUI或git的可乐)(git diffgit diff --cached好,但有时我想要更多)。
maaartinus 2013年

Answers:


4

暂存区的目的是为提交提供一个灵活的空间。我认为,如果将git与集中化的版本控制系统(例如Subversion)进行对比,这将变得更加清晰。

颠覆

在Subversion中,您可以选择提交工作副本的某些文件。但是只有完整的文件。现在:如果您要暂存file A而不是file B,并且暂存与file C相关的文件A部分,而不是依赖于文件更改的部分,那该怎么办B(因为那样您将存在提交一致性问题)。

吉特

Git通过提供暂存作为第二个工作副本来解决此问题。在暂存区域中,您将整理要提交的快照(大致而言)。

因此,您可以在暂存区域中创建一个快照,其中包括对的更改A以及C仅反映的更改的文件版本A

对于具体问题

  • 您可以在任何时候上演。我个人更喜欢在提交之前进行上演。

  • 当暂存文件中的更改然后在工作副本中更改该文件时,您当然没有更改暂存文件。您可以决定是否也进行这些更改,或者是否进行更改。即,如果您运行git gui citool,将会看到暂存和未暂存版本的差异(用于行式暂存和提交的漂亮且简单的工具)。

  • Git在这里非常谨慎,这可能是一件好事。

一般提交策略:粒度提交

我认为在谈论“我应该何时上演”这个问题时,还应该谈论承诺习惯。

集中式VCS

在您提交到中央服务器的集中式版本控制系统中,对于您的同事来说,您的提交是完整且经过良好测试的,这一点很重要。因此,人们会尝试不经常提交,然后提交完整文件的状态,以最大程度地减少错误的可能性。因此,提交往往是相当大的块,其中包含很多更改(如果它们不是简单的修复程序)。提交中的更改可能完全不相关。

吉特

在Git中,提交是在本地执行的,只有将它们推送到服务器才能使其公开。因此,从某种意义上讲,提交是廉价的。颠覆意义上的提交与git commit后跟的多个提交相当git push。这种差异很重要。

即使您在同一文件中更改了其他行,Git也允许您提交一行代码。这给您带来很多好处,因为例如您可以在第100行中提交安全错误修正,同时更改第300-350行以引入新功能。

  • 您可以在不同的提交中分开不同的更改。这样可以在您的版本历史记录中很好地将它们分开,甚至还可以还原其中一个而不是另一个。
  • 您的提交不一定必须反映工作副本的“编译”状态(尽管我尝试保持这种状态)。

那么,Subversion用户期望的提交中的“质量控制”和构建保证在哪里?它已转移到git中的其他动作。您仍然希望在公共存储库中推出程序的运行状态。因此,在推出更改之前,请确保测试成功并且程序可以运行。

另外,尝试最大程度地利用分支机构。提交许多小的更改时,您将获得相当大的版本历史记录。如果您在分支机构工作,则可以按分支机构名称这些细粒度的提交进行分类,然后将它们合并回去(选项--no-ff还将保留这些功能,这些特征驻留在唯一的分支机构中)。

也就是说master,如果分支处于良好状态,则只能保持合并到分支的习惯。您还可以使用标签来跟踪里程碑和发布。

现在回到阶段:在每次提交中提交几行后,将在提交之前直接上演。(至少我是这样做的)。


git add -p非常好
Vorac 2013年

2

我认为您对此太重视了。暂存只是选择要包含在下一次提交中的内容。何时或如何进行分期非常重要;如果在任何给定时刻有很多分阶段和非分阶段的更改,则可能需要修改开发过程。

在项目中(首次提交后),何时才是登台源文件的恰当时机?就在提交之前?在添加/删除或修改之后吗?

我通常在提交之前就这样做(除非我注意到一些错别字,所以我也必须进行最后一刻的纠正并将其上演)。该过程如下:编辑,运行测试,阶段,提交。如果您在测试之前进行测试,则测试很可能会失败,并且您也必须进行更改并进行测试,那么为什么不将其保留到提交时间呢?

如果文件在两次提交之间暂存,然后被修改,那么Git会发生什么?它是否需要关注内容声明时的内容更改以及更改后的内容?

它将向您显示回购的当前状态和(上一次提交+分阶段的更改)之间的差异。当您暂存一些新更改时,它将仅重新计算(最后提交+已暂存的更改)状态。

如果我创建一个新文件,暂存它然后再删除它,为什么Git要求我使用“ -f”标志,而简单的“ git -rm file.ext”不起作用?

现在我在这里猜测,但这可能是因为暂存的信息可能很重要(否则您将不暂存),但是它尚未受版本控制(例如可以使用删除的文件git -rm)。因此,git要确保您知道自己在做什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.