我开始学习Git。我一直在和GitKraken玩弄,我希望使用GUI是保存和共享内容的可行途径。我更喜欢GUI,而不是命令行。
现在我了解,在GUI中,我需要先上传stage
个文件,然后commit
个文件,然后再push
个文件。但是,为什么push
和commit
是两回事呢?为什么只想在本地commit
而不进行以下上传来保持文件同步?
答案 0 :(得分:13)
几个(具体)原因。 粗体的TLDR。
第一个原因是您可能无法推送到遥控器,因为您没有连接到互联网。
第二个原因是有时候提交不准备好被推送。例如,我练习TDD。提交失败的测试后(我这样做),我不想将其推送到远程,因为这样我的团队可能会引入失败的测试套件。另一种常见的做法是在将这些提交压出之前将其压扁,以使该功能看起来像是一次提交。
第三个原因是,这是您不想与任何人共享的个人项目,因此没有任何可推广之处。您不必拥有带有git repo的遥控器。
第四个原因是您可能有多个远程控制器(通常,分布式语义会妨碍您的使用)。因此,提交后,git如何知道要推送到哪个远程服务器?他们全部?某个?七分之二?从git的角度来看,推送必须是明确的,因为git的语义是分布式VCS。有关更多详细信息,请参阅戳的答案。
PS 。这不是问题所在,但是一旦您学会了使用它们,命令行外壳程序(包括bash)便是非常强大的界面。精通这些工具后,使用它们的速度将比您将要找到的任何GUI都要快得多。这与以下事实有关:您可以使用击键而不是鼠标来执行强大的操作,并且可以根据您的需要对其进行无限自定义。
答案 1 :(得分:8)
Git是一个分布式版本控制系统。因此,没有像Subversion甚至CVS这样的单一中央存储库。因此,如果只有一个命令来提交和推送,那么该提交将转到何处?什么是远程存储库?
在Git中,没有中央存储库。存储库中甚至没有任何层次结构。对于本地存储库, any 其他存储库是可以与之交互的远程存储库。而且本地存储库只是任何其他存储库的可能的远程存储库。
因此,本地和远程只是相对于您当前位置的观点:本地存储库始终是当前存储库,其他所有存储库都是您可以与之交互的远程对象。
使用Git时,您要与之交互的是本地存储库:您可以在本地提交所有更改。这有很多好处和用例,在这里我将不做详细介绍,但是实质上,这就是使版本控制得以分发的原因,因为本地存储库具有所有信息和完整的历史记录。
因此,当您拥有具有完整历史记录和所有更改的本地存储库时,您需要一种与其他存储库进行交互的方式,以便允许您共享历史记录。做到这一点的两种方法是推和拉(或提取)。由于使用分布式存储库,因此每个存储库都是相同的,因此每个存储库都可以从另一个存储库中进行推送或拉取(假设它们具有访问权限)。
最后,提交和推送必须是独立的步骤,因为一个正在与(本地)存储库进行交互,而另一个则是与远程存储库共享更改的故意步骤。
答案 2 :(得分:3)
它们有不同的用途。每次提交都应更改代码的一个独立方面。例如,重命名变量,将对一个函数的调用替换为对另一个函数的调用,甚至只是修正注释中的错字。将它们视为回滚点;如果我对在此采取的方法改变了主意,是否可以放弃一小部分提交并仍然保留其他无关的更改?
仅当您的一系列提交达到开发中的新稳定点(经过充分测试,可以与您的同事或协作者共享)时,才应进行推送。
如果您正在工作(例如,修复小错误。但是在很多时候,有意义的是在朝着更大的目标迈进时进行单独的更改,并且只有在您认为自己已经达到那个目标时才推动。
答案 3 :(得分:1)
在过去的日子里(例如5年前-以今天的内存标准衡量的古老历史),人们有时没有连接到互联网!他们想继续工作!因此,他们只是在工作中做出承诺。建立连接后,他们将继续推进所有提交。 Git以此为主要范式进行设计。
快速浏览所有这些时代,直到现在,我们的软件版本控制机制并没有改变(很多)。
有些人争辩说,您必须将所有提交保持在本地,直到您对代码的健壮性感到满意为止。我很欣赏他们的直觉:保护主存储库代码;使其保持尽可能完美。是的,当然可以!
但是Git提供了一种机制,它对于不太完美的代码(称为分支)工作得更好。创建一个分支,对其进行处理(一直推动提交),直到满意为止,然后将该分支合并到主分支中。这样,即使计算机发生故障(硬盘驱动器崩溃,咖啡溅出,被盗等),您的所有工作仍将得到备份。那是版本控制的要点之一,对吧?
另一些人则认为,在高度分布式的开发系统中,需要指定在何处以及如何推送提交。当然,这是一个选择,但我尚未在实践中看到它。我无法想象有一家公司对开发人员说:“到那里去,你们每个人都保留自己的代码副本。我们会让您彼此感受到彼此的推挤,并希望一切都不会出错或得到解决。令人困惑。”是的设置一个Bitbucket或github帐户并告诉所有人:“使用它作为您的来源!”要容易得多。
坦率地说:每次提交时都要推送。没有缺点,如果没有的话,丢掉工作的机会很小。