快进、合并提交或将合并到工作树中,哪个选项是正确的?

10
我有一个带有两个分支masterentidades的GIT存储库。我需要将来自entidades分支的一些东西合并到master分支中。请看图片,标记为EntityBundle的文件夹是我需要从entidades合并到master中的唯一内容,我该如何操作?在SmartGit上,我点击了entidades分支的"merge"按钮,得到了像图片中展示的消息,但我搞不清楚正确的选择方式是什么,以便不破坏master存储库,请问有什么提示吗?

进入图像描述

** 我的工具中的图表表示 **

进入图像描述


实体分支已经提交并推送了吗? - hjelpmig
@hjelpmig 在 entity 分支上是最新的,但在 master 上不是。 - ReynierPM
1个回答

16

我假设你的历史看起来像这样:

* A (master, origin/master)
|
| * B (entidades, origin/entidades)
| |
< some number of commits on either branch>
| |
|/
* D
(新的提交在该图表的顶部,旧的位于底部)换句话说,entidades 一段时间以前就与 master 分支分叉了,你想在这些选项之间进行选择。你应该学会如何在你的工具中显示/查看这样的图表:它们将帮助你理解当前历史记录的样子以及对其所做的更改会产生什么效果。(这样一个图表可能会澄清你的问题。)
我还假设你正在将 entidades 合并到 master 中。(你的截图似乎证实了这一点。)
现在,你的选项:

合并

合并只是创建一个统一两个分支状态的提交。(使它们相同。)它会像这样:
* M (master)
|\
* | A (origin/master)
| |
| * B (entidades, origin/entidades)
| |
< some number of commits on either branch>
| |
|/
* D

然后,你可能会将主分支推送到远程仓库。通常,如果你在entidades上完成了工作(例如,它是一个功能分支,现在已合并到主分支),你也会同时在本地和远程删除该分支。

你的另一种选择合并到工作树我想,会执行合并操作,但不会提交结果。如果是这样,如果你接着做git commit,你最终会到达与创建合并提交完全相同的状态;前者只是给你编辑提交的机会。

变基

entidades变基到master看起来会像这样:

* B´ (entidades)
|
< the commits made to entidades >
|
* A (master, origin/master)
|
| * B (origin/entidades)
| |
< some number of commits on either branch>
| |
|/
* D

按照我的展示,entidades 最初是基于提交 D 的,因为它是从 master 分支分叉的位置;而你所做的更改是基于该点的。在这里使用 rebase 将其更改为基于提交 A。我们已经更改了分支的“基础”,或者说已经对其进行了“变基”。

变基会更改历史记录。您可以在此处看到,entidadesorigin/entidades 已经分叉:它们都有自己独特的提交。 entidades 有提交 D..B´,而 origin/entidades 有提交 D..B

如果您还没有推送分支,那么变基通常是“社交上可接受”的,因为然后只有您自己能够知道历史记录已更改。但是,一旦您将更改推送到某个远程仓库,其他人可能会以原始的 entidades 为基础进行更改:他们会注意到您正在重写历史记录。因此,推荐建议是不要对已经推送的内容进行变基,因为这可能会给人们带来麻烦。 (任何对 entidades 进行更改或创建分支的人都需要单独对其进行变基,这可能是一个冗长或繁琐的过程。)

为了将新的 entidades 推送到 origin,您需要使用 git push -f。(-f 表示“强制”;您需要强制执行它,因为您正在重写历史记录,而且出于上述原因,这通常是一项需要小心处理的事情。)

请注意,entidades 仍未合并到 master 中;但是,如果它现在基于 master 本身(即最新提交,而不是某个祖先),那么您可以将 master 设置为快进至 entidades。是否这样做取决于您。


非常好的回答,我最终添加了你在这里描述的相同图表,你能确认之前所说的吗? - ReynierPM
@ReynierPM:希望大部分的帖子都是通用的;合并更多或更少总是以相同的方式进行;变基大多也是如此。我很好奇entidadesmaster是否在过去已经相互合并,或者它们是否正如图表所示的那样:如果它们没有这样做,那么找到共同祖先将非常容易(就是它们相遇的地方)。 - Thanatos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接