如何在Git变基(rebase)和合并时永久排除指定文件?
Git变基/合并时永久保留指定分支文件的解决方案
方案一:自定义Merge驱动(仓库级持久生效)
这个方案通过配置Git的自定义合并驱动,让指定文件在任何合并、变基操作中始终保留当前操作分支的版本,且配置会随仓库提交共享,所有克隆仓库都能生效。
- 配置自定义合并驱动
在本地仓库的.git/config文件中添加以下内容:
[merge "keepLocal"] name = Always keep local branch's version driver = cp %A %B
%A代表当前操作分支的文件版本,%B是合并后要输出的文件,cp %A %B就是直接用当前分支的文件覆盖合并结果,忽略对方分支的版本。
- 绑定文件到驱动
在仓库根目录创建或修改.gitattributes文件,添加:
file1.php merge=keepLocal file2.php merge=keepLocal
将这个.gitattributes提交到仓库:
git add .gitattributes git commit -m "Configure keepLocal merge driver for file1.php and file2.php"
这样所有克隆该仓库的成员都会自动应用这个规则,无需额外配置。
方案二:钩子脚本(本地级补充)
如果自定义驱动在某些变基场景下仍有问题(比如无冲突的文件覆盖),可以配合Git钩子脚本,在变基前后自动保存和恢复指定文件。
- 编写pre-rebase钩子
创建.git/hooks/pre-rebase文件,内容如下:
#!/bin/bash # 保存当前分支的目标文件 cp file1.php .git/file1.php.bak cp file2.php .git/file2.php.bak
给脚本添加执行权限:
chmod +x .git/hooks/pre-rebase
- 编写post-rebase钩子
创建.git/hooks/post-rebase文件,内容如下:
#!/bin/bash # 恢复保存的文件 if [ -f .git/file1.php.bak ]; then cp .git/file1.php.bak file1.php rm .git/file1.php.bak fi if [ -f .git/file2.php.bak ]; then cp .git/file2.php.bak file2.php rm .git/file2.php.bak fi
同样添加执行权限:
chmod +x .git/hooks/post-rebase
注意:钩子脚本是本地文件,不会随仓库同步,若要团队共享,可将脚本放到仓库目录下,让成员手动复制到.git/hooks目录。
为什么之前的方法不生效?
.gitattributes的merge=ours是单向规则:仅在合并操作中保留当前分支版本,但变基本质是将当前分支提交重放到目标分支上,此时Git会将目标分支视为“当前分支”,导致规则反向生效,不符合你的双向保留需求。skip-worktree仅标记文件为“不被Git跟踪修改”,但变基/合并时仍会覆盖文件内容,无法阻止分支间的版本同步。
内容的提问来源于stack exchange,提问作者Bhojendra Rauniyar
相关产品推荐
相关产品推荐

