Git Pull 请求:在没有新提交的情况下将 dev 更改为 master

edo*_*edo 5 git

假设这个标准场景:

  • 两个分支,dev 和 master,引用同一个提交 C1。
  • 我向开发中提交了一些东西,比如 C2、C3、C4。
  • 我想将 dev 合并到 master 中。因此,我打开一个拉取请求(在 GitHub、GitLab、Bitbucket 等),将 dev 合并到 master 中(不压缩,不删除源分支)。
  • 我应用了拉取请求,我看到正在创建一个新的提交 C5:master 引用到 C5,dev 引用到 C4。

为什么?我想维护所有开发历史记录(所以没有挤压,C2 C3 和 C4),但是当我合并到 master 时,我希望 dev 和 master 都引用到 C4。我不认为需要创建新的提交(C4 和 C5 之间的代码差异应该是什么?它们是相同的),并且我不喜欢 dev 分支似乎位于 master 后面,而它们包含相同的代码。

您能向我解释一下为什么会这样以及是否有更好的做法吗?

Sre*_*ula 5

当您devmaster提交 C1 处的分支创建分支并在分支上添加提交 C2、C3、C4 时dev,两者的提交树masterdev发生了分歧。dev合并(具体来说,“合并”而不是“变基”)从分支 到的更改master可以通过两种方式完成 -

  1. 合并而不dev快进- 您所面临的场景属于此类。在非快进场景中发生的情况是,尽管合并. 这意味着,当您决定不希望分支在稍后的时间点引入更改时,您可以通过合并时的单个还原轻松还原分支带来的更改(多次提交)提交 C5。分支通过合并时创建的合并提交 C5保留其“身份”。这种方法通常在合并拉取请求时受到青睐并经常使用。但是,它会带来每次合并 1 次合并提交的额外开销。可以在命令行上使用分支上的以下命令来完成没有快进的合并 -master devmasterdevmasterdevmasterdevmaster

     git merge --no-ff dev  
    
    Run Code Online (Sandbox Code Playgroud)

    请注意 --no-ff 标志指示“不快进”

master合并后提交树的示意图-

       (dev)C2-C3-C4
           /        \
  (master)C1----------C5
Run Code Online (Sandbox Code Playgroud)
  1. 通过dev快进合并- 这是您期望通过拉取请求合并时会发生的情况。在快进的情况下,分支的“身份”会丢失,如下所示。合并后提交树的示意图-master devmasterdevmaster

    (master) C1-C2-C3-C4
    
    Run Code Online (Sandbox Code Playgroud)

    在本例的图中,在稍后的时间点(在添加了更多提交之后master),如果您决定删除分支带来的更改dev,您将无法准确定位与该分支相对应的提交。dev分支(特别是如果dev分支已被删除)。因此,这不是合并拉取请求的首选方法,因为恢复等操作很重要。但是,在您确实确定正在处理的分支不需要保留其身份的情况下,它非常有用。当您想要使用在远程中跟踪的分支来更新分支的本地副本时,也会使用快进git pull。该git merge命令还采用快进作为其默认行为。

注意 - 请注意,快进仅适用于将分支合并Y到分支X,如果

  1. 从分支中分离出来X后,没有任何提交添加到分支中,并且,Y
  2. Y从 . 中分离出来后,新的提交已添加到其中X

如果分割后XY都有新的提交,则无法快进。

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