本文转载自微信公众号“吴佩轩”,作者吴佩轩。转载本文请联系吴佩萱公众号。当我们第一次在项目中使用版本控制时,这个概念可能很难理解。我看到很多人(包括我)在运行gitpull、gitpush和其他我不理解的命令。为什么我必须承诺和推动?为什么我需要为每个新功能创建一个新分支?在使用Git进行了几个月的协同工作后,对版本控制的概念更加清晰,能够更好的理解和使用版本控制进行协同。让我们用一个小故事来说明版本控制是如何工作的,以及它在项目中的优势!让我们一起盖房子在这个美妙的合作项目中,我们将尝试一起盖房子。简而言之,只有我们两个人在房子里工作。我们不是房子的所有者,我们为其他人(利益相关者)处理房子的内容,他们告诉我们他想要什么和在哪里。我们有4面墙-Master分支我们从4面墙和屋顶开始,坚固、耐用且非常好,这4面墙代表我们的Master分支,它们目前已实现,不会被删除。利益相关者批准了四堵墙,甚至可能是他自己选择的,并希望保留它们。我们需要做的就是改善这四堵墙,并在它们之上或周围建造。无论如何,我们要建造的任何东西都将基于这四堵墙。业主想要一个客厅和一个厨房-FeatureBranch正如我之前提到的,有两个人在做这个项目,我和另一个同事张三。每个房间都有一个特色,在这种情况下,约翰和我将致力于不同的特色,以最大限度地提高结果,我将设计客厅,约翰将设计厨房,到目前为止一切顺利。我们都创建了一个功能分支,我们也知道我们必须使用约定来命名我们的分支,所以我们将把我们正在处理的工作(在本例中是一个新功能),那个功能的名称,还有我们的名字。feature-living_room-wupxfeature-kitchen-zhangs分支的命名有多种约定,这只是一种建议。我们都从master分支创建功能分支,所以我们都有相同的四堵墙开始,但是,我们的功能分支是master分支的完全独立副本,对master分支的内容没有直接影响,这确保那如果我和张三将四壁中的一堵完全毁掉,而主支部的四壁还屹立不倒。我想在本地保存设计-gitcommit就像在本地保存更改,每个新的提交都有一个数字,也代表一个你可以返回的保存点,就像在任务游戏中你可以回到之前保存点是同样,所以当John构建机柜时,他可以提交它们以确保他的更改不会丢失,并且如果他构建的下一部分危及机柜的质量,他可以回滚。因此,当Bob构建厨柜时,他可以提交它们以免丢失他的更改,并承诺如果他构建下一部分,他将危及厨柜的质量。您还需要每次提交一条消息,因为最好写一些关于您的提交的内容,这样每个人都知道这个“保存点”包括什么,JohnSan提交的消息显示为“创建红色厨柜”。我想将设计保存在存储库中的安全位置-gitpush存储库是存储所有分支的地方,包括master分支,它就像一个包含项目所有文件的文件夹,包括它们的修订历史。Gitpush获取你的所有提交并将它们发送到分支的远程版本,该版本在在线存储库中可用,并且对分支所做的更改对所有参与的开发人员都是可见的。所以John将他的提交推送到他的远程分支,我现在可以在红色机柜上看到John的提交。我的客厅完工了,现在怎么办?-开发分支和合并请求我们的开发分支是一个整合我们的房间(或功能)的地方,我们尝试将我们的设计(或功能)结合起来,看看我们的客厅和厨房是否功能良好。如果我想将我的起居室添加到develop分支,我必须提出拉取请求,通常至少有其他开发人员必须批准您的拉取请求,然后才能在远程分支上进行合并。John的厨房已经完成,但我们的设计不匹配-合并冲突那么,会发生什么?我们有设计上的冲突,Git可以自动解决一些冲突,但不是所有冲突,Git有时需要您的帮助来确定应该保留哪些更改,因为其中一些更改相互冲突。换句话说,它需要知道保留谁的“设计”(或代码)才是正确的选择。假设我是犯错的人,我可以告诉Git在设计厨房墙壁时保留Bob的零件,而不是我的。我们什么时候可以将厨房和客厅添加到主分支?项目的这一部分通常涉及测试、批准,一旦我们的设计经过全面测试,这意味着它们也可以很好地协同工作,我们的风险很高或者,房主批准设计,然后我们可以决定将我们的更改合并到master分支,也就是说从现在开始,我们房子的稳定版也会包括我们的客厅和厨房,所以所有的新分支都至少要包括这些房间。在某些情况下,将master分支的每个先前版本保留在不同的分支中可能是明智的,但是,处理master分支的正确方法取决于您的团队和公司的需求或指导方针。总之,版本控制是轻松安全协作的核心。在团队项目中使用Git允许多个开发人员独立地处理同一个项目,而不会经常干扰彼此的输入。每个开发人员都会获得一个独立的代码版本,他们可以修改这些代码,而不会冒破坏代码稳定版本的风险。Git复制代码和在不同版本上独立工作的能力使它成为任何构建应用程序的人(甚至是单独工作的开发人员)的绝佳选择,并且它使您有机会保留代码的多个版本,并跟踪每个更改的所有特征,例如谁进行了更改以及何时进行了更改。
