如何从git merge(永远)中排除一个特定的提交


How to exclude a particular commit from git merge (forever)

我正在开发一些web应用程序(php, codeigniter)。今天是时候把它推送到github了,但是我遇到了一个我无法管理的问题。

我有两个分支:

  • master -这个分支应该用于github推送,不包含凭证或任何其他敏感数据(只是公共代码)
  • dev -这是master的子节点,用于开发,包含凭据(我的私有应用实例)

这里的凭据是指:数据库登录名、密码、主机、用户;Oauth服务id/secrets;encryption_key。凭证存储在/application/config文件夹下的两个独立文件中。

我的想法是,我将在dev上做所有的更改,然后将dev合并到master,并将master内容拉到github(但master不能包含我的私人凭据)。

这是我现在所做的:

  1. 删除了/application/config/config.php和/applications/config/database.php中的所有凭据(因为我不想让它们在github上公开),它们变成了空字符串,比如:$db['default']['hostname'] = ";
  2. 启动git存储库并进行初始提交-创建的默认分支名为'master'
  3. 将母版拉入github

它很酷,直到现在-我有我的项目代码在github没有凭据。接下来,我需要在我的项目中做一些更改,所以我:

  1. 创建新分支dev
  2. 将我的凭据存储到dev中,并进行提交-我需要dev实例具有凭据,因为我每次在代码中更改某些内容时都会将其上传到ftp服务器(我不使用本地LAMP或类似于此项目中的任何东西)

所以现在我需要在dev中做一些改变,上传它并拉到github,所以我:

  1. 在开发中进行更改(比如添加新功能)
  2. Checkout to master
  3. 将dev合并为master。

我期望发生的事情:Git会问我应该在master中使用哪个版本的配置,因为在两个分支中都是不同的。我将使用diff选择文件的"主"版本(不包含凭据)。Git会记住我的选择,以后当我将dev合并到master时,我就不必再做选择了。Git在我的另一个项目上是这样工作的,dev是一个主分支,实例是它的子分支(在这种情况下dev是一个子分支,我把子分支合并到父分支中)。

事件:Git只是把凭证从dev复制到master,没有问我这个问题。所以现在我的主分支被凭证"污染"了,我不能再把它推送到github了。

我的问题是

  1. 为什么会发生这种情况,我如何避免这种情况?
  2. 有没有其他(更好的)方法来处理这种问题。

如果有什么不清楚的地方请告诉我,我将不胜感激。

Git只会标记一个冲突,如果你的主分支中的文件在你的原始分支到dev之后被更改,那么相同的文件在dev中被更改。

我建议你为你的凭证添加一个。gitignore条目,或者使用一个环境变量将它们分开,在codeigniter中这很容易,你所要做的就是在你的apache配置(vhost如果你使用它们)上添加SetEnv APPLICATION_ENV development,然后你可以在application/configs中添加一个名为development的文件夹,现在当你在开发环境中运行时,这些配置将优先于基本配置目录中的配置。

这不是关于忽略文件或删除提交,而是一个好的文件结构和环境设置来区分不同的环境,您可以使用developmentstagingproduction(这是默认的)

Git ingore会有帮助。请阅读这篇博文以获得解决方案。

http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

您可以从配置文件中包含凭据,并将该文件添加到.gitignore

配置文件可以包含开发环境、预生产环境和生产环境的设置。