Git cherry pick和datamodel完整性

yan*_*isf 16 git version-control merge cherry-pick

鉴于两个分支已经分歧,并且需要将一个分支(而不是所有内容)的特定提交引入另一个分支,git cherry pick就是这样.

一段时间后,需要完全合并两个分支.git将如何知道它已经过去曾经提交过的提交,以便它不会重新引入它?

Von*_*onC 28

tonio的回答中提到的" 避免重复提交 "文章说:

想象一下,我们有主分支和分支b:

  o---X   <-- master
   \
    b1---b2---b3---b4   <-- b
Run Code Online (Sandbox Code Playgroud)

现在我们迫切需要master中的提交b1和b3,而不是b中的剩余提交.所以我们做的是检查master分支和cherry-pick提交b1和b3:

$ git checkout master
$ git cherry-pick “b1’s SHA”
$ git cherry-pick “b3’s SHA”
Run Code Online (Sandbox Code Playgroud)

结果将是:

  o---X---b1'---b3'   <-- master
   \
    b1---b2---b3---b4   <-- b
Run Code Online (Sandbox Code Playgroud)

假设我们在master上做了另一个提交,我们得到:

  o---X---b1'---b3'---Y   <-- master
   \
    b1---b2---b3---b4   <-- b
Run Code Online (Sandbox Code Playgroud)

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

$ git merge b
Run Code Online (Sandbox Code Playgroud)

我们会得到以下内容:

  o---X---b1'---b3'---Y--- M  <-- master
   \                     /
     b1----b2----b3----b4   <-- b
Run Code Online (Sandbox Code Playgroud)

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

$ git rebase master b
Run Code Online (Sandbox Code Playgroud)

哪个会产生:

  o---X---b1'---b3'---Y   <-- master
                       \
                        b2---b4   <-- b
Run Code Online (Sandbox Code Playgroud)

最后:

$ git checkout master
$ git merge b
Run Code Online (Sandbox Code Playgroud)

给我们:

  o---X---b1'---b3'---Y---b2---b4   <-- master, b
Run Code Online (Sandbox Code Playgroud)

(在这个帖子之后)


OP在评论中添加:

但似乎我还不太明白rebase是如何工作的......我的意思是即使在变基之后不应该仍然会出现樱桃挑选的提交?

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

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

      A---B---C topic
     /
D---E---A'---F master
Run Code Online (Sandbox Code Playgroud)

将导致:

               B'---C' topic
              /
D---E---A'---F master
Run Code Online (Sandbox Code Playgroud)

您可以检测master上是否已存在提交git cherry master(如果您在topic分支上).


ton*_*nio 16

你可能想读

Git Cherry-pick vs Merge Workflow在merge和cherry-pick之间进行了很好的比较,特别是那个cherry-pick不存储父id,因此不会知道它已经提交了过去的樱桃,所以它不会重新介绍它.

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