【问题标题】:Git: ignore some files during a merge (keep some files restricted to one branch)Git:在合并期间忽略一些文件(将一些文件限制在一个分支中)
【发布时间】:2011-04-21 13:48:32
【问题描述】:

我有两个分支,AB。分支A 有一个目录examples,其中包含一些由git 跟踪的文件,这些文件应该 出现在分支B 上。在我的工作流程中,我经常将在A 中所做的更改合并到B 中,每次examples 有一些更改时,这都是一个问题。目前我正在手动执行此操作:在合并后擦除文件或在我已经擦除的文件发生更改时解决冲突。

在合并期间是否可以忽略这些文件? (或者是否可以将某些文件限制在一个分支(A)或远离一个分支(B)?)


让我试着解释一下我这样做的原因: A 是博客的骨架(模板、脚本等),B 是我的博客(A 充满了我自己的帖子、图像、草稿等)。 A 是公开的,我试图让它对其他人看起来和使用它是通用的,但正因为如此,我需要一些帖子作为展示/测试(examples 目录)。 A 中的每一个更改,后来都合并到 B 中,以便在我的博客实例中进行这些更改 - 这样所有新示例都会出现在 B 中,所有删除的示例都出现在 B 中,这些示例在 A 中已经更改由于上次合并导致冲突。

【问题讨论】:

  • 您的工作流程似乎有问题。你有没有想过用 git 子模块来代替?
  • 我已经编辑了我的问题,解释了我为什么要这样做。我对子模块没有经验。适合这个吗?
  • 实际上,@Lestat 等。这绝对不是#928646 的重复,因为该问题涉及“冲突合并”,而这里的“所有合并”是指。在这种情况下,不会调用合并驱动程序,这会在存在冲突时取消推荐的处理文件差异的方法:即使用合并驱动程序。这个问题可以重复吗?

标签: git merge


【解决方案1】:

我在这里找到了一个很好的答案:stackoverflow Q332528

它使用了来自这里的想法:Pro-Git merge strategies

这是它的副本:

假设您要排除文件config.php

在分支 A:

  1. 在同一个目录中创建一个名为“.gitattributes”的文件,用这个 线路:config.php merge=ours。这告诉 git 使用什么策略 合并文件时。在这种情况下,它始终保留您的版本,即。 您要合并到的分支上的版本。

  2. 添加 .gitattributes 文件并提交

在分支 B:重复步骤 1-2

立即尝试合并。您的文件应保持原样。


编辑:
来自git book 关于merge=ours,“一个非常有用的选择是告诉Git 不要尝试合并特定文件当它们有冲突时,而是使用你的合并而不是其他人的。”

因此,此答案并不适用于该问题。 pjmorse's answer 关于使用子模块很好。

另一种选择是使用a sub-tree merge,这可能会带来额外的好处。

【讨论】:

  • 这对我不起作用,无论我将 myfile merge=ours 行放在 .gitattributes 还是 .git/info/attributes 中。据我了解,新文件和无文件之间没有合并冲突,因此不存在策略问题:当我合并时,我要排除的文件在“要提交的更改”中显示为“新文件:myfile”。
  • 正确,这仅在您已经提交了自己的文件版本时才有效。我已经编辑并添加了一些信息。
  • 有一个更新的article 声明您还必须通过$ git config --global merge.ours.driver true 声明我们的合并策略
  • @David 谢谢!对于阅读此答案的其他人,不要像您在答案中看到的那样在“我们的”之后加上句号。
  • @dag 你提出的观点对于我来说是必要的。感谢您指出这一点。
【解决方案2】:

随着您的更新:是的,如果所有 A 都适合 B 的子目录(反之亦然),则子模块将适合此用途。使用 WordPress 的子模块的一个示例是,如果您有一个 git WordPress 存储库;您可以为 /wp-content/themes/ 目录中的主题添加子模块。

documentation for submodules 可能会有所帮助。

如果两者的文件交错,可能会更难。大多数情况下,子模块可以以这种方式使用,相关应用程序旨在允许它们。

【讨论】:

    【解决方案3】:

    您可能会发现 git 的 rerere 命令很有用。有了它,您可以记录某些合并冲突的解决方案并在以后重用它们。

    【讨论】:

    • 我试图遵循这个:progit.org/2010/03/08/rerere.html 但它不起作用......冲突之后,git rerere statusgit rerere diff 没有显示任何内容。我已经检查过了,它在我的 ~/.gitconfig 中,我已经在我的存储库中创建了目录 .git/rr-cache ......无论如何,我可以看到这适用于在@987654325 中更改文件的情况@在A。这也适用于新文件吗? (如果在examples 中创建了一个新文件,则该文件的合并不会发生冲突 - 该文件将被添加到B)。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多