“嗨,阿米戈!”
“你好!”
“今天我将向您介绍版本控制系统。”
“正如您可能已经知道的那样,程序通常非常大,需要很长时间才能编写。有时,几十个人可能要花数年才能编写一个程序。”
“拥有数百万行代码的项目是现实。”
“哇哦。”
“这一切都非常复杂。人们经常互相干扰,经常修改相同的代码,等等。”
“为了解决这个问题,程序员开始为他们的代码使用版本控制系统。”
"版本控制系统是由客户端和服务器组成的程序。
“程序将数据(程序员编写的代码)存储在服务器上,程序员使用客户端对其进行添加或更改。”
“版本控制系统与仅使协作处理文档成为可能的程序之间的主要区别在于,它存储所有文档(代码文件)的所有先前版本。”
“你能给我更多的细节吗?这一切是如何运作的?”
“想象一下,你是一名程序员,你想要对存储在服务器存储库中的程序的源代码进行微小的更改。”
“这是你需要做的:”
“1)登录服务器。”
“2) 使用 Checkout 命令将所有文件的最新版本复制到您的计算机。”
“3) 更改所需文件。”
“4)在本地运行程序,确保编译运行。”
“5) 使用 Commit 命令将您的‘更改’发送到服务器。”
“这通常是有道理的。”
“但还有更多。想象一下,你早上上班,但在印度已经是午餐时间了。所以你的印度同事已经进行了更改,并将他们的更改提交到你服务器上的存储库。”
“您需要使用最新版本的代码。因此您执行更新命令。”
“这与Checkout有何不同?”
“ Checkout旨在复制存储库的所有文件,但 Update 仅更新自上次运行Checkout / Update命令以来服务器上已更新的文件。”
“这大概是它的工作原理:”
结帐:
“现在,假设我们更改了文件 B 并希望将其上传到服务器。为此,我们需要使用Commit命令。”
“更新命令的工作原理如下:”
“有意思!还有别的命令吗?”
“是的,有很多。但它们会根据您选择的版本控制程序而有所不同。所以,我只是试图解释一般原则。”
“还有一个操作叫做merging——合并两个文件。假设两个程序员同时修改了同一个文件。那么服务器上的程序将不允许同时提交两个更改。谁先提交就可以添加他的或者她的改变。”
“那对方是做什么的?”
“他或她将被邀请执行更新操作以从服务器获取最新的更改。顺便说一句,这——在提交之前进行更新——是一种很好的做法。”
“然后,在更新操作期间,客户端程序将尝试将本地更改与从服务器接收到的更改合并。”
“如果程序员更改了文件的不同部分,那么版本控制程序将可能能够成功合并它们。 如果更改在同一个地方,那么版本控制程序将报告合并冲突并提示用户手动合并更改。”
“例如,当两个程序员都向文件末尾添加内容时,通常会发生这种情况。”
“原来如此。总的来说,这似乎是合理的。”
“还有一件事:树枝。”
“想象一下,来自一个团队的两名程序员的任务是重写同一个模块。或者甚至更好——从头开始重写它。在这个模块完成之前,程序将无法运行,甚至可能无法编译。”
“那他们该怎么办?”
“他们通过向存储库添加分支来向前推进。粗略地说,这意味着存储库分为两部分。不是按文件或目录,而是按版本。”
“想象一下,电从未被发现,机器人也从未被发明。那么三次解放战争就永远不会发生,整个人类历史就会走上一条完全不同的道路。 ”
“这条道路是历史的另一个分支。”
“或者你可以试着把一个分支简单地想象成存储库的一个副本。换句话说,在某个时候,我们在服务器上克隆了一个存储库,这样,除了主存储库(通常称为主干), 我们还有一家分店。”
“嗯,这似乎更容易理解。
“你为什么不能直接说我们复制了存储库?”
“这不是简单的复制。”
“这些树枝既可以脱离主干,又可以并入主干之中。”
“换句话说,一些工作可以在一个分支中完成,然后当它完成时你可以将存储库分支添加到存储库主干中?”
“是的。”
“那些文件会怎样?”
“文件将被合并。”
“嗯,这听起来很酷。我希望它在行动中也一样酷。”
“然后一些。好吧,我们休息一下。”
“这里有很多有用的信息 ”
GO TO FULL VERSION