我是否正确使用Cherry-Pick

问题描述

我不确定我是否正确使用Git,所以我想知道您如何看待我的方式以及如何使其更好。
我正在为网站编程,希望包含新功能。但是对于这些功能,我不需要网站的其余部分。所以我要做的是:

  1. 在分支“ master”上,我创建了一个名为“ justBasics”的分支,如果我删除了所有不必要的内容(几乎是所有内容)。
  2. 在分支“ justBasics”上创建我的功能分支“ feature1”。例如,在“ feature1”中,我可以创建一个文件,在其中写入我的功能
  3. 现在,我想将feature1包含在母版中。 不好的是,分支“ feature1”还包含一些东西,这些东西我只需要试用一下我的功能即可,并且不属于母版,因此无法将其合并到母版中(或者我可以使用merge?我不知道怎么做。 )。例如,一些用于测试功能代码,尤其是我为了创建“ justBasics”而删除内容
  4. 要包含该功能,我回到“ master”并创建分支“ includeFeature1”。在“ includeFeature1”中,仅通过cherry-pick获得了该功能的重要提交。
  5. 现在我可以将“ includeFeature1”合并到母版中

这是我的存储库结尾处的样子:

* 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

这种方式对我有用,但是我在选择樱桃时遇到了一些问题:不知何故,当我想结帐其他分支时,一些旧的Hunks重新出现。特别是当我在master上并且尝试结帐“ JustBasics”时,c2中的Hunks删除了所有文件夹并重新出现了功能,并且无法切换分支。因此,我必须先删除它们,然后才能继续。

在其余的代码会打扰您的情况下,您如何处理完整的新功能
您如何看待我的方式?

解决方法

通常:git并非设计为具有分支,在分支中,您只能处理回购内容的一部分。如您所见,您可以制定出一个工作流程,使主要可以完成您想要的工作,但是总会有一些困难。

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

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

如果您曾经在feature1上做过额外的工作,那么您将没有办法知道已经精选到master中的提交,而不是您从未打算的提交。挑选,vs。您实际想要挑选的新提交。好的,但是您可以使用标签并提交消息约定(以及使用回购协议时要记住的另一项自定义内容)来为该解决方案建立解决方案。

如果您想共享master上的justBasics上有任何更改,则可能会遇到困难。合并很可能会发生冲突,因为“他们已编辑,我们已删除”。易于解决,但每次都会发生,还需要记住一件事。

您有点疑问您是否可以将feature1合并回master。如果您愿意,合并将尝试从master删除所有其他文件-因为删除文件是一项更改。与前面的情况一样,整个提交可能会发生冲突,但是由于未在master端对它们进行修改,因此单个文件可能会被静默删除。

在特定情况下cherry-pick可能很方便-例如在分支上进行了基础性更改,您需要它们,但还没有 准备将其合并到其中-应该谨慎使用(冲突后可能会引起头痛的奇特选择);而且我通常建议不要创建依赖常规挑选的工作流程。