git - 线性历史在版本控制中意味着什么?

标签 git version-control

我很少听说过在 Git 或 Mercurial 中保持线性历史。这实际上意味着什么?谁能给我提供一个简单的例子?

最佳答案

TL;DR - 在线性源代码控制中,每个更改都必须在另一个更改之后进行。在非线性源代码控制中,可以在任何时候同时更改代码并将其 merge 到主线中。

如果您的代码在源代码管理下具有线性历史,这意味着代码中的每个提交更改都是在前一个代码之后进行的。将其视为一个长的单一代码更改链,如下所示:

[A]---->[B]---->[C]---->[D]
                         *

* 表示HEAD

使用这种方法,您必须始终使用最新的代码,因此如果您正在提交 [B] 并且您当前正在处理最终将提交的更改 [D],您需要从存储库中 pull 以获取来自 [C] 的更改,以便在没有冲突的情况下推送您的代码。

但是,Git 允许您分支 代码,因此您可以同时处理多个版本的代码。假设这是您的提交历史到目前为止的样子:

[A]---->[B]
         *

现在假设您想进行一些更改,但又不想打扰[B]。 (也许其他人正在同时处理这段代码,谁知道呢?)在 Git 中,您可以从您正在进行的提交中分支来处理您自己的当前代码版本。这是 Git 的基石:多人可以处理同一个文件而不会覆盖彼此的更改。与具有严格线性历史的源代码控制相比,这是一个巨大的优势,在后者代码冲突更令人讨厌。

无论如何,回到例子。您创建一个新分支,而其他人继续将更改推送到原始 master 分支。

[A]---->[B]
           \
            [E]
             *

假设他们在您自己的分支上进行了两次提交,[C][D]:

[A]---->[B]---->[C]---->[D]
           \
            [E]
             *

现在,他们在做什么并不重要,因为在您的分支机构中,您拥有您自己的代码副本,您可以随心所欲地使用它。因此,您在分支 [F][G] 上进行了两次提交:

[A]---->[B]---->[C]---->[D]
           \                   
            [E]---->[F]---->[G]
                             *

测试更改后,您认为 merge 回 master 已经足够好了:

                                 *
[A]---->[B]---->[C]---->[D]---->[H]
           \                   /
            [E]---->[F]---->[G]

这基本上就是非线性源代码控制的工作原理。您可以看到,对于很多人来说,在不踩脚趾的情况下处理相同的代码片段是非常容易的。现在,如果两个人正在处理同一个文件,仍然会出现 merge 冲突,但 Git 有一个名为 git-merge 的好工具,可以帮助 merge 两个人对同一个文件的并发更改。

关于git - 线性历史在版本控制中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22249259/

相关文章:

git - TortoiseGit - 在此处撤消创建存储库

git - 在新存储库上推送 origin master 错误

git - git:如何以编程方式确定是否需要 pull 或 push ?

version-control - 计划不周、分支多、精神 split 的应用程序的版本号方案是什么

tfs - TFS 中的孤立分支

Git:将 HEAD 移回上一个提交

git - 如何让 git 显示作者日期指定日期范围内的提交?

xcode - 移动到不同的 Mac 时,Git 子模块文件在 XCode 中显示为红色

svn - 如何显示来自 subversion 服务器的存储库列表

sql - 如何在master分支上提交DB相关代码?