Git课程:合并/变基

与以前的版本控制系统(例如CVS和SVN)相比,称为Git的分布式版本控制系统已经改变了开发人员对代码合并和分支的思考方式。.

使用Git,这些操作变得相对容易和快速。该系统允许开发人员创建与master分支隔离的新功能,并在以后准备好集成功能时进行集成.

如果您不熟悉Git,以下链接应有助于您快速入门:

  • Git –简单指南
  • Git基础
  • Git分支基础
  • 成功的Git分支模型

在Git中,有两种主要方法可以将更改从一个分支集成到另一个分支:

  1. 合并
  2. 重新设定

我们将结合使用-ff选项和–no-ff选项。注意:没有git –no-ff rebase命令.

快速演示设置

在研究两种Git合并方式之前,我们首先使用以下命令设置一个可用的Git存储库:

1个
2
3
4
5
6

mkdir mycode

回声“ foo bar baz” > mycode / foo.txt

git init mycode

cd mycode

git添加foo.txt

git commit -m“提交消息”

现在,我们创建一个名为“ myfeature”的新分支并切换到该分支:

1个 git checkout -b myfeature

现在我们可以在本地仓库的“ myfeature”分支中更改“ foo.txt”文件:

1个
2

echo -e“ foo bar baznquux” > foo.txt

git commit -a -m“添加了我的功能”

假设我们的“ myfeature”更改已完成,现在我们想将此功能集成到“ master”分支中.

我们的git图如下所示:

1个
2
3

   B功能

  /

高手

如之前关于Git所述,我们有两种方法可以解决此问题:进行合并或变基.

如何使用:git merge

git merge命令将两个或多个分支连接在一起.

首先,让我们切换回“主”,以便我们可以在主分支上应用合并.

1个 git checkout主

现在,我们可以进行合并,但首先讨论创建合并的两种不同方式.

当前分支头通常是命名提交(“ myfeature”)的祖先。这是最常见的情况。在这种情况下,不需要新的提交来存储组合的历史记录。取而代之的是,git HEAD(以及索引)被更新为指向指定的提交,而不创建额外的合并提交。.

git merge的默认行为是在可能的情况下进行快进合并。可以使用-ff选项使此默认行为明确,或者可以使用no-fast-forward merge(–no-ff)选项抑制此行为。合并带注释的标签时,即使可以进行快速合并,Git也会始终创建合并提交.

使用–no-ff时,查看git历史记录的人可以清楚地看到您签出的分支以进行工作。另外,请注意–no-ff合并在末尾有一个额外的合并提交.

下图显示了–no-ff和-ff合并之间的区别.

git --no-ff重新设定

因此,您现在可以选择使用以下任一方法:

1个 git merge myfeature

执行此命令后,我们的git图将如下所示:

1个 A-B主

或者我们可以通过执行以下操作来保留分支历史记录:

1个 git merge –no-ff myfeature

在后一种情况下,我们的git图现在看起来像这样:

1个
2
3

  B功能

/

A-C大师

如果执行以下git log命令:

1个 git log –graph –full-history –all –pretty = format:“%h%x09%d%x20%s”

这将显示类似的git图:

1个
2
3
4
5

* 5368727(HEAD,硕士)合并“ myfeature”分支

|

| * 6267227(myfeature)添加了myfeature

| /

* ac54e38提交消息

您更喜欢哪种类型的合并取决于合并时要存储的分支信息数量.

如何使用:git rebase

将更改从一个分支集成到另一个分支的第二种方法是执行git rebase.

合并时将两个分支合并在一起,同时保留每个提交历史记录的图,则通过重写源分支中的更改,重新基准化分支来统一分支,以便它们显示为目标分支的子级.

git rebase将本地提交转发到更新的上游头。变基是将分支移至新的基本提交的过程.

这就是git图形中的样子。假设存在以下历史记录,并且当前分支为“ myfeature”:

1个
2
3

      A — B — C功能

     /

D — E — F — G主

如果我们现在这样做:

1个 git rebase master

结果将是:

1个
2
3

        A‘–B’–C’功能

       /

D—E—F—G主

现在,“主”分支包含提交“ G”时的“ myfeature”分支更改,而无需创建合并提交。因此,重定基础不是通过合并提交来加入分支,而是通过在master之上构建来集成“ myfeature”分支。结果是线性历史记录,开发人员可能更容易理解。 git日志现在将显示“ D—EF—G主站”的线性历史记录.

如果发生冲突,git rebase将在第一个有问题的提交时停止,并将冲突标记留在树中.

合并或变基?

最适合使用两种代码集成方法。关于什么时候应该使用某种方法有不同的意见.

以下是一些链接,它们描述了一种方法可能优于另一种方法的情况:

  • 合并或变基?
  • 何时合并与何时恢复基准
  • Git团队工作流程:合并或变基?
Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me