我试图在一个存储库中保留2个网站项目.除了模板(html,css)文件和少量配置文件外,这些网站主要是相同的.主站点(我说是Supersite)是分支机构的主人.第二个站点位于分支secondarySite中.每当我在master分支中开发一些新功能时,我想将它合并到secondarySite,但我想从合并中排除模板文件.
我在这里找到了部分解决方案如何告诉git始终为特定文件上的冲突合并选择我的本地版本?但它只有在我更改两个分支中的模板文件并且发生冲突时才有效.当没有冲突时,git只使用较新的远程版本的文件.
即使没有冲突,我如何告诉git 始终保持指定的本地文件不变.
或者我可能使用完全错误的方法解决问题?
在此先感谢您的帮助.
在每个分支中,.gitattributes
在根目录中添加文件。
对于每个分支,指定合并时要忽略的文件,如下所示:
filename merge=ours
Run Code Online (Sandbox Code Playgroud)
并且不要忘记为此激活驱动程序:
git config --global merge.ours.driver true
Run Code Online (Sandbox Code Playgroud)
尝试合并,您将看到.gitattributes
合并发生时每个分支中指定的文件将保持不变。
正如我在关于合并驱动程序的回答中提到的,它们仅在发生冲突时才有用.
这适用merge=ours
于.gitattributes
文件中的a:请参阅合并策略.
一个非常有用的选择是告诉Git在发生冲突时不尝试合并特定文件,而是将合并的一方用于其他人的.
有没有办法从branchA合并到branchB以及从branchB合并到branchA,同时完全忽略对跟踪并存在于两个分支中的文件的更改?
从根本上说,git中的提交对象包括内容状态(即指向树对象的指针)和指向所有先前历史的指针(即,提交对象的零个或多个"父"指针).
提交对象的语义可以被认为是"我查看了所有父提交中的所有历史记录,并且我的树指针中包含的状态取代了它们".所以,你可以让合并
B
到A
,但保留A
的文件副本(例如,使用'ours
’战略).但是,这就是说你考虑了A和B的状态,并决定它A
的版本取代了发生的事情B
.如果你以后想从合并A
到B
,B
的文件版本甚至不被视为合并的结果.通过不同的合并策略,没有一种聪明的方法可以解决这个问题; 它是git存储历史数据结构的一个基本方面.
如果这些模板位于子目录中,最好将它们隔离在自己的git仓库中,以便将该repo作为子模块包含在内.
如果没有,那么你需要在提交之前恢复错误合并的文件(如在这个线程中):
git merge --no-commit other
git checkout HEAD XYZ # or 'git rm XYZ' if XYZ does not exist on master
git commit
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8941 次 |
最近记录: |