Git:将功能分支与本地配置分支混合

时间:2014-03-21 16:13:40

标签: git github

我正在开发一个开源项目,我想将我的更改贡献给它。我有两个环境,我想在其上工作。第一个是上游环境,另一个是我的生产环境。我目前的做法是保留两个独立的分支机构;一个功能分支包含我想要推回到上游的更改和一个本地配置分支,我需要更改我需要使软件适应我的生产配置。功能分支将有许多提交,但配置分支只有一个提交。

我的问题是如何在环境之间来回切换。我需要使用功能分支和本地配置分支进行开发,但是当我回到上游时,我不希望从本地配置分支进行提交。我也不想通过恢复来污染我上游的提交。

另一种提问方式是图形化。鉴于下面的图片,我想使用c1 + f1..fN处理代码,但是当我创建一个pull请求时,我不希望c1成为pull请求的一部分。我不希望c1 +恢复c1。

a commit tree

2 个答案:

答案 0 :(得分:1)

我历史上通过简单地重写历史记录来处理这个问题,以便在我合并上游功能分支时删除配置提交。考虑一下:

S                     (starting point, whichever branch you're working off of)
S - A                 ('config' branch)
S - A - B - C - D - E ('feature' branch, based off 'config')

假设您小心没有任何更改与A中所做的更改冲突,您可以运行:

git checkout feature
git rebase -i {upstream remote}/{upstream branch}

并从历史记录中删除A,然后再合并上游的更改。

这会让你:

S - B' - C' - D' - E'

应该为上游存储库提供一个干净的拉取请求。

也就是说,不同的团队对历史重写有不同的容忍度。但是,如果你是独自工作,它的影响应该非常小。

答案 1 :(得分:1)

使用git(或任何VCS)解决此问题的方法并不是很好。

使用git的最佳解决方案是在推送之前删除提交,正如joshtkling在他的回答中解释的那样。

然而,有一些缺点:

  • 你必须注意不要依赖“config”提交的“功能”提交,否则你在删除配置提交时会遇到冲突,这可能会变得混乱。
  • 每次推送时都必须记住删除配置提交;存在意外推送过多的风险(甚至可能在配置提交中甚至是密码之类的东西?)。
  • 推送后,必须重新引入“config”提交,直到上游接受推送。
  • 最后,如果你想在本地使用多个分支,那么在它们之间进行合并会很困难,因为你必须在上面进行变基。

简而言之,它会在简单的情况下起作用,但会变得很痛苦。

我的建议:尝试更改应用,以便您不需要“配置”提交。

根据需要改变可配置的内容,因此您无需更改代码。恕我直言,如果您需要更改代码(或上游提供的其他部分)以使软件适应您的环境,这是一个不好的迹象 - 所以您的更改也可能对其他人有所帮助。