Git - 如果我想拥有一致的工作流程,那么 cherry-pick 是一种不好的做法吗?

标签 git cherry-pick

<分区>

我发现 cherry-pick 在某些情况下特别有用,例如,当我有一个 feature1 分支和一个 test-feature1 分支时,并且我想应用在测试中发现的更正;或者换句话说,我想测试新功能,为此我需要在测试分支中使用这些新功能。

这里cherry-pick的好处是我可以选择我想在其他分支应用的具体改变;也许 merge 整个分支并不有趣。

我在过去的项目中一直使用这种做法,但我认为这种做法会导致工作流程不一致。 cherry-pick-ing 是一种不推荐且可以避免的做法吗?

最佳答案

使用 git cherry-pick 是不错的做法。你用它做什么可能会也可能不会。许多事情都是如此。 git push -f --no-verify origin master 不好吗?如果您不小心或不知道自己在做什么,它可能会挽救您的生命或给您带来麻烦。

以下工作流程并不少见:

您在 develop 分支中实现,两周后您将代码发布给您的 Beta 测试人员。两周后,如果没有任何问题,您将测试版升级为生产版:

     develop --a--b--c--d
                         \
release-beta -------------d'
                           \
release-prod ---------------d''

这种情况一直持续下去,直到有一天在生产中发现问题...幸运的是,在您的 develop 分支中提交 f 将修复它。

您有几个选择:

您可以将 develop merge 到 release-beta 中,快速跟踪 beta 测试周期并立即发布到生产环境。问题在于您可能会或可能不会过早地发布代码。您的 Beta 测试人员可能没有机会发现一些讨厌的错误。

或者您可以将 f 挑选到 release-prod 分支上,运行您的测试并在您对结果满意的情况下发布到生产环境:

                              +---- hot fix
                              |
                              v
     develop --a--b--c--d--e--f--g
                         \     \
release-beta -------------d'    \
                           \     \
release-prod ---------------d''---f'

git cherry-pick 的诅咒(或祝福)是它会暴露您在制作小的、独立的更改单元方面的好坏。

考虑这个场景:

// foo.js
function foo() {
  ...
}

// foo.test.js
test.todo('foo does something awesome', () => {
  // TODO
})

但是你在两个单独的提交中提交了这两个文件......

123abc fix: implement foo function to fix issue in production
456fgh fix: implement tests for foo function

在某些测试框架中,.todo 注释会自动使您的测试运行失败,以提醒您仍然需要实现测试……太棒了!所以你的 develop 分支失败了,但你知道为什么。

还记得上面的提交 f 吗?原来它只包含代码而不包含测试...所以当您在 release-prod 分支中运行测试时,没有任何失败...因为该提交没有引入失败的测试!

但事情变得更糟了……提交 f 解决了一个生产问题,但又造成了另一个问题!如果您在一次提交中交付代码和测试,这本可以避免。


以我的拙见,没有根本性的不良做法;您只能评估在给定情况下您的选择是什么。知道哪些是最好的来自实践和经验。没有 Elixir 。

这可能不是您想要的答案:git cherry-pick 是不错的做法。如果您知道如何何时使用它,它就是一个有用的工具。

关于Git - 如果我想拥有一致的工作流程,那么 cherry-pick 是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626874/

相关文章:

git - merge 未在任一分支中修改的文件中的冲突

git - 通过 Android Studio 提交的 Git 作者日期不正确

java - 找不到或加载主类,为什么?

mercurial - 如何在 Mercurial 中挑选单个版本?

git - cherry-pick : Mainline branch is not specified but b0c4de0c8e164d09efe73a24aec3f9096c860e1f is a merge commit

git - 暂存时在 Git 中对文件进行分组

svn - 用 git-svn cherry-pick

Git 提交触及子树/子文件夹

在没有其他远程更改的情况下从远程主分支进行 git cherry pick

git - 错误 : Colour each commit a different colour