复制和粘贴Git中的提交

6 浏览
0 Comments

复制和粘贴Git中的提交

`git cherry-pick ` 是什么意思?

0
0 Comments

Git中的提交复制和粘贴(Copy and paste commits in Git)是一种将特定的提交从一个分支复制到另一个分支的方法。它通常用于将维护分支的提交应用到开发分支中。使用git cherry-pick命令可以将指定的提交应用到当前分支上,并创建一个新的独立的提交。严格来说,git cherry-pick并不改变仓库中的现有历史记录,而是将新的提交添加到历史记录中。然而,由于应用差异的过程可能会引发冲突,因此可能需要解决冲突才能完全应用给定提交的更改。

在下面的示例中,我们可以看到使用git cherry-pick命令将提交F应用到了rel_2.3分支上:

$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, below

在此之前的状态如下:

![before](https://i.stack.imgur.com/R4nfN.png)

在应用了git cherry-pick命令后的状态如下:

![after](https://i.stack.imgur.com/23fCh.png)

当将cherry-picked的提交从分支b1交付给主分支时,并且如果也尝试将分支b1(原始提交来源)交付给主分支时,会发生冲突吗?事实上,通过之前的合并操作,这些冲突已经得到解决。因此,如果您在分支b1中进行了a、b、c和d的更改,然后只cherry pick了"c"提交。在将来,一旦从分支b1合并到主分支,由于"c"的更改是相同的,它只会合并a、b和d的更改,并保留"c"的更改。但是,如果您回滚合并操作,那么"c"的更改将会被撤消。您将需要单独回滚这些更改。

需要强调的是,在给定的示例中,仅将差异(F - E)应用于Z。这是一个狭窄的情况。Cherry-pick也可以用于应用多个提交之间的差异,例如(F - E)、(E - D)、(D - C)和(C - B)。这等价于应用差异(F - B)。

如果所选的提交(示例中的F)具有多个直接前任,会发生什么?只有差异(F - E)会应用于Z。字母表示提交,单个提交应用于Z。您可以在命令中清楚地看到这一点。此外,OP询问的是“什么是cherry picking”,而不是如何应用“多个cherry picks”。此外,应用单个提交的cherry pick不是一个狭窄的情况,它实际上是一个非常常见的情况。

关于示例中的`git cherry-pick dev~2 # commit F, above`中的符号的作用,`~2`表示倒数第2个提交,`#`后面的内容是对提交F的描述。

总之,git cherry-pick命令可以将特定的提交从一个分支复制到另一个分支,并创建一个新的提交。它可以在合并分支时解决冲突,并且对于应用特定的提交更改非常有用。然而,需要注意的是,cherry-pick只会将选定的提交的更改应用到目标分支,而不是将整个文件的更改应用到目标分支。因此,在大多数情况下,使用分支合并的方式更为合适。

0