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 樱桃挑选和数据模型完整性的主要内容,如果未能解决你的问题,请参考以下文章