Lon*_*806 15 git multiple-versions branching-and-merging
我们有两个分支 - "主人"和"释放"
我们有一个文件,比如fileA
,我们希望在这两个分支上保留不同的版本.
但每一次,我们必须将'release'合并为'master',我们怎样才能实现,fileA
'master'不会被fileA
in分支'release' 覆盖.
Gre*_*con 14
Pro Git在8.2 自定义 Git — Git 属性的“合并策略”部分描述了如何获得这种效果。
合并策略
您还可以使用 Git 属性告诉 Git 对项目中的特定文件使用不同的合并策略。一个非常有用的选项是告诉 Git 在特定文件发生冲突时不要尝试合并它们,而是使用您的合并而不是其他人的合并。
如果您的项目中的某个分支出现分歧或专门化,但您希望能够从它合并更改回来,并且您想忽略某些文件,这将很有帮助。假设您有一个
database.xml
在两个分支中不同的名为的数据库设置文件,并且您希望在不弄乱数据库文件的情况下在另一个分支中进行合并。您可以设置这样的属性:Run Code Online (Sandbox Code Playgroud)database.xml merge=ours
然后定义一个虚拟
ours
合并策略:Run Code Online (Sandbox Code Playgroud)$ git config --global merge.ours.driver true
如果您在另一个分支中合并,而不是与
database.xml
文件发生合并冲突,您会看到如下内容:Run Code Online (Sandbox Code Playgroud)$ git merge topic Auto-merging database.xml Merge made by recursive.
在这种情况下,
database.xml
保留您最初拥有的任何版本。
将其应用于您的情况,首先创建 fileA
$ echo 'master fileA' > fileA
$ git add fileA ; git commit -m "master fileA"
[master (root-commit) fba9f1a] master fileA
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 fileA
Run Code Online (Sandbox Code Playgroud)
并让它变得特别。
$ echo fileA merge=ours > .gitattributes
$ git add .gitattributes ; git commit -m 'fileA merge=ours'
[master 98e056f] fileA merge=ours
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 .gitattributes
$ git config --global merge.ours.driver true
Run Code Online (Sandbox Code Playgroud)
现在我们创建一个代表release
分支。
$ git checkout -b release
Switched to a new branch 'release'
$ echo 'release fileA' > fileA
$ git add fileA ; git commit -m 'release fileA'
[release 53f3564] release fileA
1 files changed, 1 insertions(+), 1 deletions(-)
Run Code Online (Sandbox Code Playgroud)
还没有发生什么特别的事情:版本控制只是在此时正常工作。
现在,我们实现了特征B上回来master
。
$ git checkout master
Switched to branch 'master'
$ touch featureB ; echo 'With Feature B' >> fileA
$ git add featureB fileA ; git commit -m 'Feature B'
[master 443030f] Feature B
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 featureB
Run Code Online (Sandbox Code Playgroud)
试着抑制你的兴奋。
这就是我们特殊的合并驱动程序发挥作用的地方。我们的英雄想要将新代码从 合并master
到release
. 首先切换分支。
$ git checkout release
Switched to branch 'release'
Run Code Online (Sandbox Code Playgroud)
fileA
包含我们期望的完整性检查。
$ cat fileA
release fileA
Run Code Online (Sandbox Code Playgroud)
合并特征B从master
。
$ git merge master
Auto-merging fileA
Merge made by recursive.
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 featureB
Run Code Online (Sandbox Code Playgroud)
这条线Auto-merging fileA
是发生特殊事情的线索。的确:
$ cat fileA
release fileA
Run Code Online (Sandbox Code Playgroud)
本节“定义自定义合并司机”在gitattributes文档解释。
该
merge.*.driver
变量的值被用来构建一个命令来运行,以合并的祖先的版本(%O
),当前版本(%A
),而另一分支的版本(%B
)。在构建命令行时,这三个标记被替换为包含这些版本内容的临时文件的名称……合并驱动程序应
%A
通过覆盖将合并结果保留在名为 with 的文件中,如果成功合并它们,则以零状态退出,如果存在冲突,则以非零状态退出。
自定义ours
驱动程序几乎不使用任何这种机制,只使用以零状态退出的true
命令。这达到了预期的效果,因为它fileA
从我们当前所在的任何分支开始——这是我们想要的结果——然后在合并覆盖阶段什么都不做(即,忽略名为 的另一个分支的版本%B
),最后告诉 git一切顺利,退出状态成功。
归档时间: |
|
查看次数: |
2766 次 |
最近记录: |