理解Git中的“stage”概念

7

我仍然很难理解Git中的staging概念。

是否可以将其与SVN进行类比?在Git中,拥有stage级别的主要目的是什么?


1
过分追求细节:它不是“GIT”,而是“Git”。它不是任何缩写或首字母缩略词,Linus是以自己的名字命名的。 - millimoose
3个回答

7
暂存区的主要优势在于,您可以轻松地仅提交给定文件中的部分更改。(例如使用 git add -p。)据我所知,在SVN中进行“部分”提交的唯一方法是在单个文件级别上,或通过手动备份文件并暂时还原您不想提交的更改。
如果(像我这样)你不是高度组织化的开发者,并且希望能够在事后将更改排序成“整洁”的提交,那么这将非常有用。这符合Git的一般态度,即更喜欢为您提供灵活性而不是强制执行严格性。如果您不需要它,则可以选择不使用它,而是使用 git commit -a ...
与SVN无法进行类比,因为SVN不是Git,没有这种概念。

7

相似之处:

应该作为存储库的一部分的文件必须添加以进行跟踪。这两个工具都使用add命令来完成此操作。添加文件意味着准备提交。

不同之处:

在添加文件时,Git允许更多的详细信息。您可以决定添加整个文件或不同的代码行。 将文件添加到索引阶段可以提供更多的灵活性。SVN会自动提交已添加到存储库中的文件的所有更改。Git将每个提交操作关联的更改(行或文件)的决策留给用户。换句话说:Git中的下一个commit只包含已经被暂存的那些更改(行或文件),而不管文件的跟踪状态如何。SVN会自动包括所有已跟踪文件上的更改。

附加信息:

尝试阅读一些描述Git工作流程的文章,例如Oliver Steele的文章。但要注意,使用Git的方法不止一种 - 有很多种。如果您愿意,可以像使用SVN一样使用Git。
不要指望在短时间内就能理解Git的哲学。我花了一年时间才开始使用它,我仍然学习新的使用方法。如果你从SVN思维方式成长起来,这可能会更难。有大量的材料可供使用:文章、视频等等 - 花点时间尝试其中一些。以下是我收集的列表中的一些选择。


不要试图在一开始就回答所有问题。Git允许犯错误。实际上很难丢失数据!回答你关于git pull的问题-->有一个命令git pull --rebase,它避免了自动创建的合并提交。 - JJD
这是否意味着在Git中add=stage? - jebberwocky
@jebberwocky 是的,git add会将文件放入 stage 或者说是加入到 index 中。 - JJD
1
Git Immersion课程的第七个实验有一个很好的总结,我引用一下:“在git中进行单独的暂存步骤符合摆脱源代码控制的哲学。您可以继续对工作目录进行更改,然后在您想要与源代码控制交互的时候,git允许您记录小的提交来准确记录您所做的更改。” - Mauricio Aviles
1
Oliver Steele 的链接已经失效。 - kiwicomb123
显示剩余3条评论

4
以下是展示暂存的有用性的一些情境:
  • 你正在处理某个部分并在整个项目中做了很多更改。在测试完整个项目之前,你不想立即提交它们。但是,这些更改通常足够独立,以使多个逻辑提交比一个大提交更好。这时,你可以暂存选择的部分并进行多次提交。

  • 在调试时,暂存特别有帮助。你可以散布日志语句以跟踪错误源。然后,你进行修复,并使用这些日志语句再次进行测试。但是然后,在删除这些日志语句之前,你想先提交修复。

  • 另一个证明它很有用的情况是当你正在做某事时,发现与之无关的内容(例如,拼写错误),需要快速解决以便继续工作。

还有其他几种类似的情况,一旦你掌握了它,你可能就不能再使用不具备此概念的任何东西 :)。

PS:我根本没有使用过 SVN,所以无法对两者进行比较。


1
你所说的这些都不需要暂存区。例如,你可以使用 git commit <specific files> 将多个更改分成多个提交。当然,这会经过暂存区,但仅在直接提交之前很短暂地经过暂存区。 - Kaz
我只想通过一些场景来突出分阶段的概念。您可以用多种方式实现一个目标。这不是分阶段有用的场景的完整列表,也不是实现这些结果的唯一方法。只是从我的经验中提供的示例,以便了解分阶段的优势。 - Sailesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接