Git拉取请求:开发人员无需重新提交即可成为主节点

时间:2018-07-07 10:49:21

标签: git

假设此标准方案:

  • dev和master两个分支引用同一提交C1。
  • 我将一些东西投入开发人员,例如C2,C3,C4。
  • 我想将开发人员合并为主人。因此,我打开了一个拉取请求(在GitHub,GitLab,Bitbucket中,无论如何),以将dev合并到master(不压扁,不删除源分支)。
  • 我应用了拉取请求,然后看到正在创建一个新的提交C5:主引用到C5,开发引用到C4。

为什么?我想保留所有开发人员的历史记录(所以不要压扁,C2,C3和C4),但是当我合并到master时,我希望dev和master都引用C4。我不认为有必要创建一个新的提交(C4和C5之间的代码差异应该是什么?它们是相同的),而且我不希望dev分支似乎在master后面,而它们却包含相同的代码。

您能告诉我为什么,如果有更好的做法吗?

1 个答案:

答案 0 :(得分:3)

当您在提交C1的dev分支中创建一个master分支并在dev分支上添加提交C2,C3,C4时,两个master的提交树和dev分歧了。合并(特别是“合并”而不是“变基”)从dev分支到master的更改可以通过两种方式完成-

  1. dev合并为master 而没有快速转发-您面临的情况属于此类别。在非快速转发情况下,发生的情况是尽管您的dev分支“ 保留了其身份”,但已合并到master中。其含义是,当您决定不希望以后将dev分支所带来的更改更改为master时,可以轻松地还原所带来的更改(多次提交)通过dev分支在合并提交C5上在master中进行单个还原。 dev分支通过合并时创建的合并提交C5保留其“ 身份”。此方法通常在合并拉取请求时受青睐并经常采用。但是,它附带了每次合并都要进行1次合并提交的额外开销。可以在命令行上使用master分支上的以下命令来完成不进行快速转发的合并-

     git merge --no-ff dev  
    

    请注意--no-ff标志,指示“无快速转发”

合并后master的提交树的图解说明-

       (dev)C2-C3-C4
           /        \
  (master)C1----------C5
  1. 通过快速转发将dev合并到master -这是您期望将dev合并到{{1 }}通过拉取请求。在快速转发的情况下,master分支的“身份”会丢失,如下所示。 合并后dev的提交树的示意图-

    master

    在这种情况下的图中,在稍后的时间点(将更多提交添加到(master) C1-C2-C3-C4 之后),如果您决定删除master分支带来的更改,则将无法确切地指出与dev分支相对应的提交(特别是如果dev分支已被删除)。因此,这不是用于合并拉请求的首选方法,在该请求中,诸如还原之类的操作很重要。但是,在确实确定正在使用的分支不必保留其标识的情况下,它很有用。当您要使用分支dev在远程中跟踪分支的情况下更新分支的本地副本时,也会使用快速转发。 git pull命令也将快进作为其默认行为。

注意- 请注意,如果

,则快进仅适用于将分支git merge合并到分支Y
  1. 从分支X分离后,尚未向分支X添加任何提交,
  2. Y中分离出来的新提交已添加到Y中。

如果XX在拆分后都进行了新的提交,则无法进行快进。

参考-https://confluence.atlassian.com/bitbucket/git-fast-forwards-and-branch-management-329977726.html