Git 但是我可以禁用暂存区吗?

Git 但是我可以禁用暂存区吗?,git,Git,我发现了两个问题(由同一个用户提出)关于是否可以禁用临时区域 没有一个答案真正回答了这个问题。它们都是某种味道的 你应该学会热爱舞台 改用commit-a 但真正的答案是什么?我是否可以设置git选项,以便将部分更改移动到临时区域的尝试失败?我猜答案是“不”,因为如果答案是“是”的话,有人会在上面的一个问题上提到它 (对于上下文,我使用commit--patch提交,我认为不需要临时区域。) (编辑:我想知道如何禁用临时区域,因为我希望经验较少的合作者能够避免以工具强制的方式与此功能

我发现了两个问题(由同一个用户提出)关于是否可以禁用临时区域

没有一个答案真正回答了这个问题。它们都是某种味道的

  • 你应该学会热爱舞台

  • 改用
    commit-a


但真正的答案是什么?我是否可以设置git选项,以便将部分更改移动到临时区域的尝试失败?我猜答案是“不”,因为如果答案是“是”的话,有人会在上面的一个问题上提到它

(对于上下文,我使用
commit--patch
提交,我认为不需要临时区域。)


(编辑:我想知道如何禁用临时区域,因为我希望经验较少的合作者能够避免以工具强制的方式与此功能交互。Git已经让他们很困惑了。临时区域是一个额外的不必要的复杂性。)

不,这是不可能的。许多人都试图隐藏或隐藏Git的索引,也就是缓存,也就是暂存区,但都失败了,原因很简单:Git实际上从索引/暂存区中的任何内容进行新的提交

这有几个后果,其中一些是立即发生的,一些是稍后发生的,包括:

  • 工作树的内容对Git来说并不重要,只是作为获取要存储到索引中的文件的地方。您可以使用
    git commit-a
    来解决这个问题,它的效果非常类似于在运行
    git commit
    之前运行
    git add-u

  • 当且仅当文件存在于索引中时,才会跟踪该文件。如果不注意索引的存在,就无法解释文件的跟踪、未跟踪、未跟踪和忽略状态,即使您主要使用
    git commit-a
    解决它

  • git status
    命令运行两个比较:一个从
    HEAD
    commit到索引,另一个从索引到工作树。解释其输出的唯一方法是确认索引的存在

  • 最终,如果你选择这样做,索引将使用
    git add-p
    和其他面向补丁的操作(
    checkout-p
    reset-p
    )存储部分更改。当然,你可以完全避免这些;那么你就看不到索引的这个方面了

  • 在合并操作期间(我喜欢称之为“合并为动词”)会发生冲突,冲突状态会记录在索引中。Git将有冲突的文件的所有三个副本放入索引中。索引中的每个文件实际上有四个暂存槽。此时,基本版本进入插槽1,
    头部
    或本地或
    --我们的
    版本进入插槽2,远程或其他或
    --他们的
    版本进入插槽3。解决冲突实际上意味着自己进行合并工作,然后将结果复制到正常的暂存槽0中,删除三个编号较高的暂存条目

  • Mercurial在其他方面与Git非常相似,没有索引/暂存区域。这证明这个概念是可能的。然而,Mercurial实现这一点的方式是,它将工作树视为建议的新提交,而不是有一个单独的索引对象作为建议的新提交。Mercurial还有另一个单独的对象,称为manifest,它确定跟踪哪些文件。冲突期间的合并状态存储在第三个位置(dircache)。在某种程度上,这实际上会变得更加复杂,尽管它使使用Mercurial的通常情况变得更加简单和用户友好


    要使Git像Mercurial一样工作,您需要包装每个Git操作:向用户隐藏整个用户界面和实现,并使用一些辅助状态来跟踪索引状态为何是这样。本质上,您需要创建自己的manifest和dircache来记住哪些文件要复制到索引中或从索引中复制出来,从而使事情看起来好像工作树就是建议的提交。您需要自己的状态包装器,甚至可能希望始终在分离头部模式下运行(我没有充分考虑角落案例,例如,
    hg histedit
    等效)。

    不,这是不可能的。许多人都试图隐藏或隐藏Git的索引,也就是缓存,也就是暂存区,但都失败了,原因很简单:Git实际上从索引/暂存区中的任何内容进行新的提交

    这有几个后果,其中一些是立即发生的,一些是稍后发生的,包括:

  • 工作树的内容对Git来说并不重要,只是作为获取要存储到索引中的文件的地方。您可以使用
    git commit-a
    来解决这个问题,它的效果非常类似于在运行
    git commit
    之前运行
    git add-u

  • 当且仅当文件存在于索引中时,才会跟踪该文件。如果不注意索引的存在,就无法解释文件的跟踪、未跟踪、未跟踪和忽略状态,即使您主要使用
    git commit-a
    解决它

  • git status
    命令运行两个比较:一个从
    HEAD
    commit到索引,另一个从索引到工作树。解释其输出的唯一方法是确认索引的存在

  • 最终,如果你选择这样做的话,它就是使用git add-p存储部分更改的索引