【问题标题】:Am i using cherry-pick correctly我是否正确使用樱桃采摘
【发布时间】:2020-09-10 12:38:04
【问题描述】:

我不确定我是否正确使用了 Git,所以我想知道您对我的方式的看法以及如何使它变得更好。
如果我想包含新功能,我正在编写一个网站。但是对于这些功能,我不需要网站的完整其余部分。所以我要做的是:

  1. 在“master”分支上,我创建了一个名为“justBasics”的分支,我删除了所有不必要的内容(几乎是所有内容)。
  2. 在“justBasics”分支上,我创建了我的功能分支“feature1”。例如,在“feature1”中,我可以创建一个新文件,在其中写入我的功能。
  3. 现在我想将 feature1 包含在 master 中。 坏事是分支“feature1”还包括我只需要尝试我的功能并且不属于主人所以不能将它合并到主人的东西(或者我可以使用合并吗?我不知道怎么做。 )。例如一些用于测试功能的代码,或者特别是我为创建“justBasics”而删除的内容。
  4. 要包含该功能,我返回“master”并创建分支“includeFeature1”。在“includeFeature1”中,我只通过cherry-pick获得了该功能的重要提交。
  5. 现在我可以将“includeFeature1”合并到 master

这就是我的存储库最后的样子:

* c9     (master) merging branch "includeFeature1"
|\
* | c8   some work on master to make this look better
| * c7   (includeFeature1)cherry picking commit c3 and c5 
|/
* c6     some work on master to make this look better
| * c5   (feature1) finished feature1
| * c4   some code that is necessary to test feature1. I don´t want this code at the end in my website.
| * c3   started feature1. add a file to work in
| * c2   (JustBasics) i deleted folders, features, preparing main.html to show nothing.
|/
* c1     website til this point. that includes other features

这种方式对我有用,但我在使用cherry-pick 时遇到了一些问题:不知何故,当我想结账其他一些分支时,一些老帅哥又出现了。特别是当我在master上并且我尝试签出“JustBasics”时,来自c2的Hunks被我删除了所有文件夹和功能重新出现并且我无法切换分支。所以我必须先删除它们才能继续。

如果您的其余代码会打扰您,您将如何处理完整的新功能?
你觉得我的方式怎么样?

【问题讨论】:

  • 您不需要网站的其余部分,但它会变得杂乱无章。为什么不把网站的其他部分留在里面?
  • 编辑网站时,我不希望我的新功能与旧代码交互,反之亦然。它的加载速度也更快,我不必单击任何地方来查看我的更改。我希望它尽可能干净和简单。

标签: git git-cherry-pick


【解决方案1】:

一般来说:git 的设计目的不是为了拥有只处理 repo 内容子集的分支。如您所见,您可以制定出一个大部分可以满足您需求的工作流程,但总有一些不完善的地方。

如果有一部分代码应该单独处理,我建议将其拆分到自己的存储库中;那么它就变成了一个依赖管理问题(即如何在构建时重新组合正确的版本)——这可以通过任意数量的工具来解决,如果你想要一个仅 git 的解决方案,也可以使用子模块或子树来解决。

以下是“删除一堆文件的分支”方法的一些甚至更大的问题:

如果您曾经对 feature1 进行过额外的工作,那么您将无法知道您已经在 master 中挑选了哪些提交,而不是您从未打算挑选的提交, 与你真正想要挑选的新提交相比。好的,但是您可以使用标签来解决该问题,并可能提交消息约定(以及使用存储库时要记住的另一件事)。

如果您想将master 上的更改分享到justBasics,您可能会觉得很困难。合并很可能会发生冲突,因为“他们编辑了,我们删除了”。很容易解决,但每次都会发生,还要记住一件事。

您有点怀疑是否可以将feature1 合并回master。如果您这样做了,合并将尝试从master 中删除所有其他文件 - 因为删除文件是一种更改。与前一种情况一样,整个提交可能会发生冲突,但个别文件可能会被静默删除,因为它们没有在 master 端进行修改。

虽然cherry-pick 在特定情况下可以派上用场 - 例如在分支上进行了基础更改,您需要它们,但尚未准备好合并分支 - 应谨慎使用(一个樱桃挑选,冲突可能会在以后引起头痛);我通常建议不要创建依赖于定期挑选的工作流程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多