我正在开始学习Git。我一直在使用GitKraken,希望使用GUI来保存和共享文件是可行的途径。我更喜欢GUI而不是命令行。
现在我明白,在GUI中,我需要将文件stage
,然后commit
它们,最后push
以上传它们。但是为什么push
和commit
是两个不同的步骤呢?为什么我只想commit
本地文件,而不跟着上传以保持文件同步呢?
我正在开始学习Git。我一直在使用GitKraken,希望使用GUI来保存和共享文件是可行的途径。我更喜欢GUI而不是命令行。
现在我明白,在GUI中,我需要将文件stage
,然后commit
它们,最后push
以上传它们。但是为什么push
和commit
是两个不同的步骤呢?为什么我只想commit
本地文件,而不跟着上传以保持文件同步呢?
P.S. 这个和问题不相关,但命令行Shell(包括bash)是非常强大的接口,一旦你学会了如何使用它们。在你熟练掌握这些工具后,使用它们比任何GUI都要快得多。这与你可以通过按键执行强大的操作而不是用鼠标有关,而且它可以无限定制以适应您的需求。
Git是一种分布式版本控制系统,因此不存在像Subversion或甚至CVS那样的单一中央仓库。如果有一个单独的提交和推送命令,那么提交内容将会去哪里?远程仓库在哪里?
在Git中,没有中央仓库。甚至没有仓库的层次结构。对于本地仓库,任何其他仓库都是它可以交互的远程仓库。而本地仓库只是任何其他仓库的可能的远程仓库。
因此,本地和远程只是相对于您当前位置的视角:本地仓库始终是当前仓库,每个其他仓库都是您可以交互的远程仓库。
在使用Git时,您与之交互的是本地仓库:您本地提交所有更改。这具有许多好处和用例,我不会在此详细介绍,但本质上它是使版本控制分布式的原因,因为本地仓库具有所有信息、完整的历史记录。
因此,当您拥有具有完整历史记录和所有更改的本地仓库时,您需要一种与其他仓库进行交互的方式,以便允许您共享历史记录。这两种方法是推和拉(或获取)。由于分布式仓库每个仓库都是相同的,因此每个仓库都可以从另一个仓库推送或拉取(假设它们有访问权限)。
最终,提交和推送需要是分开的步骤,因为一方面是与(本地)仓库交互,而另一方面则是故意将更改共享到远程仓库。
在过去的日子里(就像五年前一样——按照今天的记忆标准,这已经是古代历史了),人们有时候 没有连接到互联网! 他们想要继续工作!所以他们在工作时就提交了代码。当连接实现后,他们会将所有提交推送上去。Git 就是以这种方式为主要范例而设计的。
现在跨越所有那些年代来到现在,软件版本控制机制(大致)没有改变。
有些人认为你应该将所有提交都保留在本地,直到你满意自己的代码非常健壮。我欣赏他们的本能:保护主要存储库代码;使它尽可能完美。是的,请务必这样做!
但 Git 提供了一种更适合不太完美代码的机制,它被称为分支。创建一个分支,在上面工作(同时推送提交),直到满意,然后将该分支合并到主干。这样,如果你的计算机遇到问题(硬盘崩溃、洒出咖啡、被盗等),你所有的工作仍然备份了。这就是版本控制的一点,对吧?
然而,还有其他人认为,在高度分布式的开发系统中,需要指定何时如何推送提交。这肯定是一个选择,但我还没有看到过这种做法。我想象不出一个公司会对其开发人员说:“你们每个人都去保留代码副本。我们将让你们随意推送和拉取,并希望什么都不会出错或变得混乱。” 是的,设置一个 Bitbucket 或 Github 帐户并告诉每个人:“使用这个作为你的源!”会更容易得多。
所以坦率地说:每次提交都推送。这样做没有任何不利影响,如果不这样做,可能会有一些小概率遗失工作。
i
键才能响应。它的另一个模式——命令模式——是许多魔法发生的地方。只是你没有在输入缓冲区中键入内容而已。) - Chris