git:如何在分支之间合并,同时保留一个分支独有的变更集?

kch*_*kch 14 git version-control merge branch dvcs

对于将绝对路径和数据库凭证硬编码到Web应用程序中的多个随机位置的人来说,地狱中有一个特殊的地方.可悲的是,在他们下地狱之前,他们正在对地球造成严重破坏.我们必须处理他们的代码.

我必须对其中一个这样的Web应用程序执行一些小的更改.我创建了一个新分支features,并执行全局查找和替换以更新本地环境的路径和凭据.我承诺了.我也把它标记为local.

我快乐地陷入危险的黑客攻击,经过一百个令人困惑的补丁之后,我想将我的features更改合并到master分支中,但我不希望将一个local提交合并.

开始,我将合并来回之间masterfeatures,我想local留在原地的features,并且永远不会显示在master.

理想情况下,我希望所有这一切都神奇地发生,尽可能少有趣的参数.

是否有一种简单明显的方法可以让我失踪?

我能想到一对,但他们都要求我记住我不想要那个提交.这绝对不是我的强项.特别是对于如此糟糕的黑客程序.

如果做不到这一点,我对处理这种情况的更复杂,手动的方法感兴趣.

小智 6

我对此问题的解决方案使用rebase而不是merge

从这样的提交树开始:

a-b-c <-- master
 \
  d <-- local
   \
    e-f-g <-- dev
Run Code Online (Sandbox Code Playgroud)

$ git rebase --onto master local dev

       master 
       V 
   a-b-c-e'-f'-g' <-- dev
     \
      d <-- local
Run Code Online (Sandbox Code Playgroud)

$ git checkout master

$ git merge dev

               master 
               V 
   a-b-c-e'-f'-g' <-- dev
     \
      d <-- local
Run Code Online (Sandbox Code Playgroud)

$ git rebase --onto master master local

               master 
               V 
   a-b-c-e'-f'-g' <-- dev
                \
                 d' <-- local
Run Code Online (Sandbox Code Playgroud)

$ git branch -f dev local

               master 
               V 
   a-b-c-e'-f'-g'
                \
                 d' <-- local
                 ^
                 dev
Run Code Online (Sandbox Code Playgroud)

  • 好.现在,如何与一个解释所有这些魔法的地方的良好链接?:)我之前已经扫描过git-scm.com/book,但我没有理解你刚刚做了什么. (2认同)

Von*_*onC 1

技术 (Git) 解决方案将使用git attributes属性合并。

merge
Run Code Online (Sandbox Code Playgroud)

该属性merge会影响在 .NET 期间需要进行文件级合并时文件的三个版本的合并方式git merge

您将在SO问题“如何告诉git始终选择本地版本以进行特定文件上的冲突合并? ”中找到使用此类属性的示例,以在合并到给定文件时强制保留某些文件的本地版本分支。

设置合并属性的问题是包含路径的文件可能包含其他更改的代码,我想要合并这些代码

不要忘记您可以关联任何类型的脚本来通过git attributes. 其中包括一个脚本,该脚本能够将您想要的更改保留在本地,同时合并其余部分。编写这样的“合并管理器”比较复杂,但它是一种实现临时自动化解决方案的方法。


一个技术含量较低的解决方案是将配置值配置文件分开:

  • 配置文件仅包含要替换的名称
  • 配置值是多个文件(每个环境一个),每个名称都有实际值。

脚本用于将实际配置文件中的名称替换为给定环境所需的配置值文件之一的值。