为什么在 git 中没有推送就提交?

Why commit without a push in git?

我开始学习了Git。我一直在摆弄 GitKraken,我希望使用 GUI 是保存和共享内容的可行途径。我更喜欢 GUI 而不是命令行。

现在我明白了,在 GUI 中,我需要 stage 个文件,然后是 commit 个文件,然后是 push,以上传它们。但是为什么 pushcommit 是两个不同的东西呢?为什么只想 commit 在本地,而不通过以下上传来保持文件同步?

几个(具体的)原因。 TLDR 以粗体显示。

第一个原因是您可能无法推送到远程,因为您没有连接到互联网。

第二个原因是有时提交还没有准备好被推送。例如,我练习 TDD。在我提交了一个失败的测试(我这样做了)之后,我不想将它推送到远程,因为这样我的团队可能会引入一个失败的测试套件。另一种常见的做法是在将这些提交推出之前压缩这些提交,因此该功能看起来像是一个单独的提交。

第三个原因是,这是一个个人项目,您不想与任何人共享,因此根本没有可推送的遥控器。您不必拥有带有 git 存储库的遥控器。

第四个原因是您可能有多个遥控器(通常,分布式语义会妨碍)。那么在你提交之后,git 怎么知道你想推送到哪个远程呢?他们都?某一个?七个人中的某两个?由于 git 作为分布式 VCS 的语义,从 git 的角度来看,推送必须是明确的。有关详细信息,请参阅 poke 的回答。

P.S. 这与问题无关,但是一旦你学会了,命令行 shell(包括 bash)是非常强大的界面使用它们。在您熟练使用这些工具之后,使用它们比您将要找到的任何 GUI 都快得多。这与这样一个事实有关,即您可以使用击键而不是鼠标来执行强大的操作,并且它可以无限定制以满足您的需求。

Git是分布式版本控制系统。因此,没有像 Subversion 甚至 CVS 那样的 单一 中央存储库。因此,如果只有一个命令来提交和推送,那么该提交会去哪里呢?什么是远程存储库?

在 Git 中,没有中央存储库。存储库中甚至没有任何层次结构。对于本地存储库,any 其他存储库是它可以与之交互的远程存储库。并且本地存储库只是任何其他存储库的可能远程存储库。

所以本地和远程只是相对于您当前位置的观点:本地存储库始终是当前存储库,而其他每个存储库都是您可以与之交互的远程。

使用 Git 时,您的本地存储库就是您与之交互的对象:您在本地提交所有更改。这有很多好处和用例,我不会在这里详细介绍,但本质上它是分布式版本控制的原因,因为本地存储库拥有所有信息,完整的历史记录。

因此,当您拥有包含完整历史记录和所有更改的本地存储库时,您需要一种与其他存储库交互的方式,以便共享历史记录。执行此操作的两种方法是推和拉(或获取)。由于使用分布式存储库,每个存储库都是相同的,每个存储库都可以从另一个存储库推送或拉取(假设它们具有访问权限)。

最后,提交和推送需要是分开的步骤,因为一个是与(本地)存储库交互,而另一个是与远程存储库共享更改的有意步骤。

它们有不同的用途。每次提交都应该更改代码的一个孤立方面;例如,重命名一个变量,将对一个函数的调用替换为对另一个函数的调用,甚至只是修复注释中的拼写错误。将它们视为回滚点;如果我改变了我对此处采用的方法的想法,我是否可以放弃一小部分提交并仍然保留这些其他不相关的更改?

只有当您的一系列提交在开发中达到新的稳定点时才会发生推送,该点已经过足够的测试可以与您的同事或合作者共享。

如果您正在工作,则每次提交都进行一次推送并非不可能或不寻常。关于修复小错误。但很多时候,在朝着更大的目标前进时进行个人更改是有意义的,并且只有在您认为自己已经达到该目标时才进行推动。

另一个答案:没有很好的理由

在过去(比如五年前——以今天的记忆标准来看,这是古老的历史)人们有时 没有连接到互联网! 他们想继续工作!所以他们只是在工作时承诺。建立连接后,他们会继续推进所有提交。 Git 的设计以此为主要范例。

所有那些时代都快进到现在,你看,我们软件的版本控制机制没有(太大)改变。

有些人认为您应该将所有提交都保存在本地,直到您对代码的健壮性感到满意为止。我很佩服他们的直觉:保护主存储库代码;尽可能保持完美无瑕。是的,当然,请做!

但是 Git 提供了一种机制,它可以更好地处理不那么完美的代码,它被称为分支。创建一个分支,对其进行处理(一直推动提交)直到满意为止,然后将该分支合并到主分支。这样,如果您的计算机出现问题(硬盘驱动器崩溃、咖啡溢出、盗窃等),您的所有工作仍会得到备份。这是版本控制的要点之一,对吧?

还有一些人认为,在高度分布式的开发系统中,需要指定推送提交的位置和方式。这当然是一种选择,但我还没有在实践中看到这一点。我无法想象一家公司会对其开发人员说 "Go out there and each of you keep your own copy of the code. We'll let you push and pull from each other as you feel and hope that nothing goes wrong or gets confusing." 是的。设置一个 bitbucket 或 github 帐户并告诉所有人:"Use this as your origin!"

就容易多了

直言不讳:每次提交都推送。这样做没有任何坏处,如果不这样做,有可能会丢掉工作。