如何在合并时让git忽略一个目录

50

虽然如何设置Git驱动程序以在合并时忽略文件夹的答案非常有趣和有用,但它没有回答我的根本问题,我仍然感到困惑。

与上面链接的问题不同,我有两个具有相同目录集的分支,为了将一个分支合并到另一个分支中,我需要让Git完全忽略一个目录。

我尝试了自己的合并驱动程序,就像如何告诉Git始终选择我的本地版本来解决特定文件上的合并冲突?所述,但这种方法的问题是只有在这两个分支中有实际冲突的文件时才会调用此驱动程序。每当某个文件的更改仅在一个分支上时,Git会在不调用我的合并驱动程序的情况下进行合并。

这导致目录中的文件发生我不想要的更改。您有任何想法吗,我该如何让Git始终忽略该目录中的每个文件 - 无论是否被修改?


最近我一直在研究Git,发现它存在一个问题,就是无法选择性地合并内容,这可能会阻止我们使用它。 - user606723
git filter-branch 命令可能是您正在寻找的。它允许您在过滤合并内容时执行合并操作。http://git-scm.com/docs/git-filter-branch - David Culp
谢谢您的回答,但我不明白在这种情况下如何应用filter-branch而不需要为每个合并手动进行大量工作。 - Sebastian Thiebes
2个回答

88

我实际上不使用Git,但我认为这对您的情况可能有用:

请使用此处指定的内容:https://gist.github.com/564416

git checkout master    
git merge --no-commit --no-ff development
git reset -- /path/to/folder # revert updates from path
git commit

再次强调,我不使用git,我只是根据自己在TryGit的经验来推测事情是如何工作的。

  1. 切换到master分支
  2. 合并,但不提交,不使用快进模式
  3. 合并现在已经被暂存,所以重置整个目录结构
  4. 提交

1
我认为你也应该在如何设置Git驱动程序以在合并时忽略文件夹中给出这个答案。也许考虑不显示检出步骤?这是无关紧要的,我认为它会削弱解决方案的简洁性。 - jthill
1
如果我的编辑没有生效,重置应该是 git reset -- path/to/folder - jthill
1
似乎仍然存在问题:我尝试删除未跟踪的文件 - 这些文件可能是由于合并而添加到目录中的,但有一些文件仍然存在。然而,这些文件在原始分支上从未出现过,因此似乎resetcheckout没有完全产生预期的效果。 - Sebastian Thiebes
1
重置不应该是一个--硬重置吗? - user338519
2
主要问题在于,如果您决定稍后合并该文件夹,它将不会被合并,因为Git认为它已经合并过了。因此,这是一种解决方法,但会破坏您的工作流程。 - Codingday
显示剩余5条评论

1

假设我在分支staging上,想要合并dev分支并忽略/build文件夹中的更改:

git checkout staging
# go to staging branch

git checkout dev .
# this checkout dev file changes into staging

git reset HEAD build
# this remove added file in build folder

git clean -f
# this drops untracked files we just reseted

git checkout -- .
# this drops changed files we just rested

git status
# check is everything ok

git commit -am 'merge dev into branch'
# create a commit

git merge -s ours dev
# this create a fake merge to trick Git into thinking that a branch is already merged when doing a merge later on.

这个解决方案并不完美,因为它会将所有提交合并成一个。 这意味着挑选一些提交可能不太合适。

但它能够避免由重命名/新建/删除引起的构建文件夹中大量需要清理的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接