Viv*_*ath 5 git version-control merge rebase cherry-pick
如果我的符号或术语错了,我道歉.我已经git
在我的个人项目上使用了一段时间,并且不必处理复杂的合并场景.我们开始在工作中使用它,并且正在遇到更复杂的场景.我还是一个git
新手,所以我想弄清楚樱桃采摘的最佳做法.
情景一
在这里,我们有一个master
,fix
和develop
分支.在我们分支之后fix
,我们将版本号更新为1.0.1
.我们做了相同的develop
,并将版本号更改为1.1.0
.
比方说,修复F1
,F2
和F3
都致力于fix
.出于这些,我们关心的修复F2
和F3
,而不是F1
因为它是一个改变一个弃用的功能.我们也不关心版本号的变化1.0.1
.
现在我们可以将这些更改合并回来master
,fix
而不会出现问题.但是如果我想将这些变化合并到一起develop
呢?现在我正在使用git cherry-pick
挑选F1
和F2
.此外,对于大量的提交,我使用一系列提交樱桃挑选,这似乎工作正常.这是最好的做事方式吗?
这让我想到了下一个场景git cherry-pick
:
情景2
如果术语不正确,或者我的图表没有意义,我再次道歉.这是我能描述的最好的.
所以在这种情况下,我们hotfix
除了上面的分支之外还有一个分支.比方说,有人承诺修补程序H1
和H2
进入hotfix
,然后合并这些变化为master
,fix
和develop
.
大约在同一时间,别人犯的修复F1
,F2
以及F3
到fix
分支,但在交错的方式(因此F1
在之前提交H1
,并H2
前承诺F3
.现在工作的人fix
要同步跟进,让他运行git pull
,这使这些变化是有序的.我们也假设没有冲突.
现在,让我们说这个人想把他所有的修复合并到develop
.在这种情况下,如果他git cherry-pick
在提交时使用了一系列提交F1
,并在提交结束时会发生F3
什么?那些合并会被忽略吗?据我所知,你无法挑选合并(因为你需要指定主线).那么在这种情况下,会git cherry-pick
简单地忽略那些合并吗?
此外,为了不必处理这种情况,最好是总是 rebase
而不是做一个git pull
,以便你的更改后应用?这样您就可以指定提交范围,但不包括合并.
谢谢,如果我的问题很愚蠢或者没有任何意义,我会道歉.
情景一
现在我正在使用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
,看看结果如何.
归档时间: |
|
查看次数: |
800 次 |
最近记录: |