在这些场景中使用git cherry-pick是否正确?

Viv*_*ath 5 git version-control merge rebase cherry-pick

如果我的符号或术语错了,我道歉.我已经git在我的个人项目上使用了一段时间,并且不必处理复杂的合并场景.我们开始在工作中使用它,并且正在遇到更复杂的场景.我还是一个git新手,所以我想弄清楚樱桃采摘的最佳做法.

情景一

在此输入图像描述

在这里,我们有一个master,fixdevelop分支.在我们分支之后fix,我们将版本号更新为1.0.1.我们做了相同的develop,并将版本号更改为1.1.0.

比方说,修复F1,F2F3都致力于fix.出于这些,我们关心的修复F2F3,而不是F1因为它是一个改变一个弃用的功能.我们也不关心版本号的变化1.0.1.

现在我们可以将这些更改合并回来master,fix而不会出现问题.但是如果我想将这些变化合并到一起develop呢?现在我正在使用git cherry-pick挑选F1F2.此外,对于大量的提交,我使用一系列提交樱桃挑选,这似乎工作正常.这是最好的做事方式吗?

这让我想到了下一个场景git cherry-pick:

情景2

在此输入图像描述

如果术语不正确,或者我的图表没有意义,我再次道歉.这是我能描述的最好的.

所以在这种情况下,我们hotfix除了上面的分支之外还有一个分支.比方说,有人承诺修补程序H1H2进入hotfix,然后合并这些变化为master,fixdevelop.

大约在同一时间,别人犯的修复F1,F2以及F3fix分支,但在交错的方式(因此F1在之前提交H1,并H2前承诺F3.现在工作的人fix要同步跟进,让他运行git pull,这使这些变化是有序的.我们也假设没有冲突.

现在,让我们说这个人想把他所有的修复合并到develop.在这种情况下,如果他git cherry-pick在提交时使用了一系列提交F1,并在提交结束时会发生F3什么?那些合并会被忽略吗?据我所知,你无法挑选合并(因为你需要指定主线).那么在这种情况下,会git cherry-pick简单地忽略那些合并吗?

此外,为了不必处理这种情况,最好是总是 rebase而不是做一个git pull,以便你的更改后应用?这样您就可以指定提交范围,但不包括合并.

谢谢,如果我的问题很愚蠢或者没有任何意义,我会道歉.

Fel*_*peC 5

情景一

现在我正在使用git cherry-pick来挑选F1和F2.

你的意思是F2和F3,对吗?基本上这个:

git cherry-pick F1..F3
Run Code Online (Sandbox Code Playgroud)

如果是这样,那没关系.或者,您可以创建一个临时分支和rebase:

git checkout -b for-develop F3
git rebase --onto develop F1
git checkout develop
git merge for-develop
Run Code Online (Sandbox Code Playgroud)

您实际上不需要创建分支,因为您可以直接使用SHA-1,或者使用reflog,但是,为了简化起见,我使用了分支.

请注意,这git rebase基本上是一个美化的樱桃选择,所以在一天结束时它会做同样的事情.

情景二

如果他在提交F1时使用git cherry-pick并提交一系列提交,并以F3提交结束,会发生什么?那些合并会被忽略吗?

您可以告诉cherry-pick忽略与--no-merges的合并,因此合并提交本身将被忽略(M1,M2),但不会忽略提交本身(H1,H2).既然你已经有'开发'那些可能会产生一些问题.如果git cherry-pick --skip实施的话,这不会是一个问题(我发送了补丁但从未应用过).

但你可以告诉cherry-pick忽略已经存在的提交:

git cherry-pick --no-merges --right-only --cherry-pick develop...F3
Run Code Online (Sandbox Code Playgroud)

您可以尝试git log使用相同的参数来查看哪些提交将被挑选出来.或者您可以自己指定它们:

git cherry-pick F2 F3
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用git rebase相同的:

git checkout -b for-develop F3
git rebase --onto develop F1
git checkout develop
git merge for-develop
Run Code Online (Sandbox Code Playgroud)

请注意,我git rebase将执行与上面提到的cherry-pick命令相同的git rebase操作,并且您可以在两种方案中使用相同的命令.您也可以git cherry-pick在两种情况下使用相同的命令(使用--no-merges --right-only --cherry-pick).如果存在冲突,您可能遇到一些麻烦,特别是如果提交变空(很可能已经应用),因为没有git cherry-pick --skip.

使用它通常更安全git rebase,因为这是每个人都使用的,但如果你觉得冒险,你可以尝试一下git cherry-pick,看看结果如何.