假设这个标准场景:
为什么?我想维护所有开发历史记录(所以没有挤压,C2 C3 和 C4),但是当我合并到 master 时,我希望 dev 和 master 都引用到 C4。我不认为需要创建新的提交(C4 和 C5 之间的代码差异应该是什么?它们是相同的),并且我不喜欢 dev 分支似乎位于 master 后面,而它们包含相同的代码。
您能向我解释一下为什么会这样以及是否有更好的做法吗?
当您dev从master提交 C1 处的分支创建分支并在分支上添加提交 C2、C3、C4 时dev,两者的提交树master都dev发生了分歧。dev合并(具体来说,“合并”而不是“变基”)从分支 到的更改master可以通过两种方式完成 -
合并而不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)
通过dev快进合并- 这是您期望通过拉取请求合并时会发生的情况。在快进的情况下,分支的“身份”会丢失,如下所示。合并后提交树的示意图-master devmasterdevmaster
(master) C1-C2-C3-C4
Run Code Online (Sandbox Code Playgroud)
在本例的图中,在稍后的时间点(在添加了更多提交之后master),如果您决定删除分支带来的更改dev,您将无法准确定位与该分支相对应的提交。dev分支(特别是如果dev分支已被删除)。因此,这不是合并拉取请求的首选方法,因为恢复等操作很重要。但是,在您确实确定正在处理的分支不需要保留其身份的情况下,它非常有用。当您想要使用在远程中跟踪的分支来更新分支的本地副本时,也会使用快进git pull。该git merge命令还采用快进作为其默认行为。
注意 -
请注意,快进仅适用于将分支合并Y到分支X,如果
X后,没有任何提交添加到分支中,并且,YY从 . 中分离出来后,新的提交已添加到其中X。如果分割后X和Y都有新的提交,则无法快进。
参考 - https://confluence.atlassian.com/bitbucket/git-fast-forwards-and-branch-management-329977726.html
| 归档时间: |
|
| 查看次数: |
1994 次 |
| 最近记录: |