假设此标准方案:
为什么?我想保留所有开发人员的历史记录(所以不要压扁,C2,C3和C4),但是当我合并到master时,我希望dev和master都引用C4。我不认为有必要创建一个新的提交(C4和C5之间的代码差异应该是什么?它们是相同的),而且我不希望dev分支似乎在master后面,而它们却包含相同的代码。
您能告诉我为什么,如果有更好的做法吗?
答案 0 :(得分:3)
当您在提交C1的dev
分支中创建一个master
分支并在dev
分支上添加提交C2,C3,C4时,两个master
的提交树和dev
分歧了。合并(特别是“合并”而不是“变基”)从dev
分支到master
的更改可以通过两种方式完成-
将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
通过快速转发将dev
合并到master
-这是您期望将dev
合并到{{1 }}通过拉取请求。在快速转发的情况下,master
分支的“身份”会丢失,如下所示。
合并后dev
的提交树的示意图-
master
在这种情况下的图中,在稍后的时间点(将更多提交添加到(master) C1-C2-C3-C4
之后),如果您决定删除master
分支带来的更改,则将无法确切地指出与dev
分支相对应的提交(特别是如果dev
分支已被删除)。因此,这不是用于合并拉请求的首选方法,在该请求中,诸如还原之类的操作很重要。但是,在确实确定正在使用的分支不必保留其标识的情况下,它很有用。当您要使用分支dev
在远程中跟踪分支的情况下更新分支的本地副本时,也会使用快速转发。 git pull
命令也将快进作为其默认行为。
注意- 请注意,如果
,则快进仅适用于将分支git merge
合并到分支Y
中
X
分离后,尚未向分支X
添加任何提交,Y
中分离出来的新提交已添加到Y
中。 如果X
和X
在拆分后都进行了新的提交,则无法进行快进。
参考-https://confluence.atlassian.com/bitbucket/git-fast-forwards-and-branch-management-329977726.html