Git的樱桃挑选和数据模型的完整性Git的樱桃挑选和数据模型的完整性(Git cherry pick

2019-05-10 09:26发布

鉴于两个分支有分歧和具体的承诺从一个分支(而不是一切)需要被介绍给其他的git樱桃挑选正是实现。

一段时间后,有需要的两个分支合并完全。 怎么会知道的git它已经提交,这是樱桃采摘在过去,这样它不会恢复死刑?

Answer 1:

你可能想读

Git的摘樱桃VS合并工作流程的合并和摘樱桃之间比较不错,尤其是摘樱桃不存储父ID,因而不会知道,它已经提交,这是樱桃在过去采摘,使其不会恢复死刑。

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



Answer 2:

在“ 避免重复犯中提到”文章托尼奥的回答说:

试想一下,我们有主支和分支B:

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

现在我们迫切需要在提交B1和B3的主人,而不是在b中的剩余的提交。 所以,我们做的是结账主分支和摘樱桃提交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

比方说,我们做的另一个承诺上主,我们得到:

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

如果我们现在就合并分枝b进入主:

$ 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

(在这个线程 )


该OP在注释中补充说:

但仍然似乎我不很明白如何变基工作。我的意思是,即使基础重建后不应樱桃采摘的提交仍然出现?

号的git commit手册页明确提到:

如果上游的分支已经包含所做的改变 (例如,因为你邮寄这是上游应用补丁程序), 然后犯下将被跳过
例如,运行git变基上的以下历史主(其中A”和A引入同一组的变化,但具有不同的提交者信息):

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

将导致:

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

您可以检测是否提交已经存在于主用git cherry master (如果你是在topic分支)。



文章来源: Git cherry pick and datamodel integrity