Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我要在Git中提交之前使用stage?_Git - Fatal编程技术网

为什么我要在Git中提交之前使用stage?

为什么我要在Git中提交之前使用stage?,git,Git,我是版本控制新手,我知道“提交”本质上是在更新您正在处理的新“当前”版本时创建备份 我不明白的是,从实际的角度来看,登台是为了什么。登台是名存实亡还是有目的?当你承诺的时候,它无论如何都会承诺一切,对吗 编辑:我想我可能混淆了术语。“暂存”文件是否与“跟踪”文件相同?提交时,只会提交索引中的更改(“暂存”文件)。这有很多用途,但最明显的是将您的工作更改分解为更小、自包含的部分。也许您在实现功能时修复了一个bug。您可以git add仅添加该文件(或者git add-p仅添加文件的一部分!),然后

我是版本控制新手,我知道“提交”本质上是在更新您正在处理的新“当前”版本时创建备份

我不明白的是,从实际的角度来看,登台是为了什么。登台是名存实亡还是有目的?当你承诺的时候,它无论如何都会承诺一切,对吗


编辑:我想我可能混淆了术语。“暂存”文件是否与“跟踪”文件相同?

提交时,只会提交索引中的更改(“暂存”文件)。这有很多用途,但最明显的是将您的工作更改分解为更小、自包含的部分。也许您在实现功能时修复了一个bug。您可以
git add
仅添加该文件(或者
git add-p
仅添加文件的一部分!),然后在提交其他所有内容之前提交该错误修复。如果您使用的是
gitcommit-a
,那么您只是在提交之前强制
添加所有内容。如果要利用暂存文件,请不要使用
-a

您还可以使用
--cached
to many命令将暂存文件视为中间工作副本。例如,
git diff--cached
将向您展示stage与
HEAD
的不同之处,这样您就可以看到您将要提交的内容,而不必混合其他工作更改。

  • 暂存区域提供使提交更小的控件。只需在代码中进行一次逻辑更改,将更改的文件添加到暂存区域,最后如果更改不好,则签出到上一次提交或以其他方式提交更改。这样可以灵活地将任务拆分为较小的任务并提交较小的更改。有了暂存区,更容易专注于小任务
  • 它还让你有机会休息,忘记休息前你做了多少工作。假设您需要更改三个文件以进行一次逻辑更改,并且您已经更改了第一个文件,并且在开始进行其他更改之前需要长时间休息。此时,您无法提交,您希望跟踪已完成的文件,以便在返回后不需要尝试记住已完成了多少工作。因此,将文件添加到临时区域,它将保存您的工作。当您回来时,只需执行
    git diff--staged
    ,检查您更改了哪些文件以及在哪里,然后开始进行其他更改

暂存区有助于我们更灵活地制定提交。通过手工,我的意思是将提交分解为逻辑单元。如果您想要一个可维护的软件,这是非常关键的。实现这一点最明显的方法是:

您可以在一个工作目录中处理多个功能/错误,并且仍然可以进行有意义的提交。拥有一个包含所有活动工作的单一工作目录也非常方便。(这可以在没有临时区域的情况下完成,前提是更改不会与文件重叠。此外,您还需要手动跟踪更改是否重叠)

您可以在此处找到更多示例:


最好的一点是,这些优点并不局限于这些工作流程。如果确实出现了一个独特的工作流,您几乎可以肯定暂存区将帮助您解决问题。

如果您设想在Github上的存储库中维护一个日志文件,那么更容易理解git命令的用法
add
commit
。 对于我来说,典型项目的日志文件可能如下所示:

---------------- Day 1 --------------------
Message: Complete Task A
Index of files changed: File1, File2

Message: Complete Task B
Index of files changed: File2, File3
-------------------------------------------

---------------- Day 2 --------------------
Message: Correct typos
Index of files changed: File3, File1
-------------------------------------------
...
...
...and so on
我通常以一个
git pull
请求开始一天,然后以一个
git push
请求结束一天。因此,一天记录中的所有内容都对应于它们之间发生的事情。每天,我都要完成一个或多个逻辑任务,这些任务需要更改一些文件。在该任务期间编辑的文件列在索引中

每个子任务(此处为任务A和任务B)都是单独的提交。
git add
命令将文件添加到“已更改文件索引”列表中。这个过程也称为登台。
git commit
命令记录/完成更改和相应的索引列表以及自定义消息

请记住,您仍然只是更改存储库的本地副本,而不是Github上的副本。在此之后,只有当您执行“git推送”时,才能执行所有这些记录的更改,以及每次提交的索引文件,才能登录到主存储库(在Github上)

例如,要获取该虚拟日志文件中的第二个条目,我将执行以下操作:

git pull
# Make changes to these files
git add File3 File4
# Verify changes, run tests etc..
git commit -m 'Correct typos'
git push

简而言之,
gitadd
gitcommit
允许您将对主存储库的更改分解为系统的逻辑子更改。正如其他答案和评论所指出的,它们当然还有更多的用途。然而,这是最常见的用法之一,也是Git背后的一个驱动原则,它是一个多阶段的修订控制系统,与其他流行的版本控制系统(如Svn)不同。

分级的一个实际用途是文件提交的逻辑分离

由于暂存允许您继续对文件/工作目录进行编辑,并在您认为一切就绪时进行部分提交,因此您可以对逻辑上不相关的编辑使用单独的暂存

假设您有4个文件
fileA.html
fileB.html
fileC.html
fileD.html
。您对所有4个文件进行了更改,并准备提交,但
fileA.html
fileB.html
中的更改在逻辑上是相关的(例如,两个文件中的新功能实现相同),而
fileC.html
field.html
中的更改是独立的,并且在逻辑上与以前的文件无关。您可以先处理文件
fileA.html
fileB.html
,然后提交这些文件

git add fileA.html
git add fileB.html
git commit -m "Implemented new feature XYZ"
然后在下一个圣
git add fileC.html
git add fileD.html
git commit -m "Implemented another feature EFG"