Git 樱桃挑选和数据模型完整性

Posted

技术标签:

【中文标题】Git 樱桃挑选和数据模型完整性【英文标题】:Git cherry pick and datamodel integrity 【发布时间】:2011-02-07 08:22:48 【问题描述】:

鉴于两个分支已经分歧,并且需要将来自一个分支(而不是所有内容)的特定提交引入另一个分支,git cherry pick 正是实现了这一点。

一段时间后,需要将两个分支完全合并。 git 如何知道它已经拥有过去挑选的提交,这样它就不会重新引入它?

【问题讨论】:

Subversion 1.5+ 通过元数据管理这个(元数据也管理合并)。在 git 合并跟踪是数据模型中固有的,因为每个提交“知道”它的父级。但在采摘樱桃的情况下,似乎有一个灰色区域。 【参考方案1】:

您可能想阅读

Git Cherry-pick vs Merge Workflow 用于在合并和樱桃挑选之间进行很好的比较,尤其是樱桃挑选不存储父 ID,因此将 知道它已经拥有樱桃挑选的提交过去,这样它就不会重新引入它。

http://davitenio.wordpress.com/2008/09/27/git-merge-after-git-cherry-pick-avoiding-duplicate-commits/ 关于在这种情况下如何避免重复提交,使用rebase

【讨论】:

@tonio 第二个链接回答了我的问题。谢谢托尼奥。但似乎我还是不太明白 rebase 是如何工作的。我的意思是即使在 rebase 之后,樱桃挑选的提交也不应该出现吗?【参考方案2】:

tonio's answer中提到的“avoiding duplicate commit”文章说:

假设我们有 master 分支和一个分支 b:

  o---X   <-- master
   \
    b1---b2---b3---b4   <-- b

现在我们迫切需要 master 中的 b1 和 b3 提交,而不是 b 中剩余的提交。所以我们要做的是检查 master 分支并选择提交 b1 和 b3:

$ git checkout master
$ git cherry-pick “b1’s SHA”
$ git cherry-pick “b3’s SHA”

结果是:

  o---X---b1'---b3'   <-- master
   \
    b1---b2---b3---b4   <-- b

假设我们在 master 上再次提交,我们得到:

  o---X---b1'---b3'---Y   <-- master
   \
    b1---b2---b3---b4   <-- b

如果我们现在将分支 b 合并到 master:

$ git merge b

我们会得到以下结果:

  o---X---b1'---b3'---Y--- M  <-- master
   \                     /
     b1----b2----b3----b4   <-- b

这意味着由 b1 和 b3 引入的更改将在历史记录中出现两次。为了避免这种情况,我们可以变基而不是合并:

$ git rebase master b

这会产生:

  o---X---b1'---b3'---Y   <-- master
                       \
                        b2---b4   <-- b

最后:

$ git checkout master
$ git merge b

给我们:

  o---X---b1'---b3'---Y---b2---b4   <-- master, b

(在this thread之后)


OP在评论中添加:

但我似乎仍然不太了解 rebase 的工作原理。我的意思是即使在 rebase 之后也不应该出现樱桃挑选的提交?

没有。 git commit man page 明确提到:

如果上游分支已经包含您所做的更改(例如,因为您邮寄了一个应用于上游的补丁),那么该提交将被跳过。 例如,在以下历史记录上运行 git rebase master(其中 A' 和 A 引入了相同的更改集,但具有不同的提交者信息):

      A---B---C topic
     /
D---E---A'---F master

将导致:

               B'---C' topic
              /
D---E---A'---F master

您可以使用git cherry master 检测主服务器上是否已经存在提交(如果您在topic 分支上)。

【讨论】:

我希望我能在 tonios answer 解决我的问题时标记两个答案,但您的回答与我内心的 tonios answer 和平相处。感谢您提供 git 内部信息! @yannisf: tonio 完全配得上绿色的勾号;)我只是想在这个话题上添加一些精确度。

以上是关于Git 樱桃挑选和数据模型完整性的主要内容,如果未能解决你的问题,请参考以下文章

樱桃挑选自动定制旧SHA-1线

合并分支,从当地分支机构挑选樱桃,没有任何冲突

Git在拉取请求分支上恢复樱桃选择而不在主控上恢复

数据模型文件的自定义 Git 合并

樱桃挑选是不是从源分支中删除提交?

樱桃采摘合并提交时的主线父编号