gpt4 book ai didi

git - 在这些场景下使用 git cherry-pick 是否合适?

转载 作者:太空狗 更新时间:2023-10-29 13:20:55 25 4
gpt4 key购买 nike

如果我的符号或术语有误,我深表歉意。我在我的个人项目中使用 git 有一段时间了,还没有处理过复杂的 merge 场景。我们开始在工作中使用它,并遇到了更复杂的场景。我仍然是一个 git 新手,所以我想找出 cherry-pick 的最佳实践。

场景一

enter image description here

在这里,我们有一个masterfixdevelop 分支。在我们分支 fix 之后,我们将版本号更新为 1.0.1。我们为 develop 做了同样的事情,并将版本号更改为 1.1.0

假设修复F1F2F3 已提交到修复。其中,我们关心修复 F2F3,但不关心 F1,因为它是对已弃用功能的更改。我们也不关心版本号更改为 1.0.1

现在我们可以毫无问题地将这些更改从fix merge 回master。但是,如果我想将这些更改 merge 到 develop 中怎么办?现在我正在使用 git cherry-pick 来选择 F1F2。此外,对于大量提交,我正在使用一系列提交来挑选,这似乎工作正常。这是最好的做事方式吗?

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

场景二

enter image description here

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

所以在这种情况下,除了上面的分支之外,我们还有一个 hotfix 分支。假设有人将修补程序 H1H2 提交到 hotfix 中,然后将这些更改 merge 到 master 中,修复开发

大约在同一时间,其他人提交了修复 F1F2F3fix分支,但以交错的方式(因此 F1H1 之前提交,而 H2F3 之前提交。现在从事 fix 工作的人想要同步,所以他运行了一个 git pull,它按顺序带来了这些更改。让我们假设没有冲突。

现在,假设此人想要将他的所有修复 merge 到develop 中。在这种情况下,如果他使用 git cherry-pick 进行一系列提交,从 F1 的提交开始,到 F3 的提交结束?这些 merge 会被忽略吗?据我所知,您无法挑选 merge (因为您需要指定主线)。那么在这种情况下,git cherry-pick 会忽略这些 merge 吗?

此外,为了不必处理这种情况,总是 rebase 而不是 git pull 是否更好,这样您的更改之后应用?这样你就可以指定提交的范围,它不会包括 merge 。

谢谢,如果我的问题很愚蠢或者没有任何意义,我深表歉意。

最佳答案

场景一

Right now I am using git cherry-pick to pick out F1 and F2.

你是说 F2 和 F3,对吧?本质上是这样的:

git cherry-pick F1..F3

如果是这样,那很好。或者,您可以创建一个临时分支并对其进行 rebase :

git checkout -b for-develop F3
git rebase --onto develop F1
git checkout develop
git merge for-develop

您实际上不需要创建分支,因为您可以直接使用 SHA-1 或 reflogs,但是,我使用分支是为了简化目的。

请注意,git rebase 基本上是一个美化的 cherry-pick,所以在一天结束时它会做同样的事情。

场景二

What will happen if he used git cherry-pick with a range of commits starting at the commit for F1, and ending at the commit for F3? Would those merges be ignored?

您可以使用 --no-merges 告诉 cherry-pick 忽略 merge ,因此 merge 提交本身将被忽略(M1、M2),但不会忽略提交本身(H1、H2)。由于您已经拥有那些可能会产生一些问题的“开发”。如果实现了 git cherry-pick --skip(我为此发送了补丁,但从未应用过),那将不是问题。

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

git cherry-pick --no-merges --right-only --cherry-pick develop...F3

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

git cherry-pick F2 F3

最后,你可以使用 git rebase 了:

git checkout -b for-develop F3
git rebase --onto develop F1
git checkout develop
git merge for-develop

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

通常使用 git rebase 更安全,因为这是每个人都在使用的,但是如果你喜欢冒险,你可以尝试一下 git cherry-pick 看看如何事实证明。

关于git - 在这些场景下使用 git cherry-pick 是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23749153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com