当前位置:   article > 正文

git如何合并指定文件内容_如何告诉git总是为特定文件上的冲突合并选择本地版本?...

项目合并怎么将冲突的地方选择自己的版本

对于配置文件的特定实例,我同意罗恩的回答:

配置对于您的工作区应该是“私有”(因此“忽略”,如在.gitignore档案“)。

您可能有一个配置文件。模板带着标记值在里面,还有一个脚本config.template文件转换为私有(被忽略的)配置文件。

然而,这一具体的评论并没有回答更广泛的一般性问题,即你的问题(!):如何告诉git总是为特定文件上的冲突合并选择本地版本?(对于任何文件或文件组)

这种合并是一种“复制合并”,在这种合并中,每当发生冲突时,您都会复制文件的“我们的”或“他们的”版本。

对于“一个文件”(通常是一个文件,而不是一个“config”文件,因为它是一个糟糕的例子),您可以通过一个通过合并调用的自定义脚本来实现这一点。

Git将调用该脚本,因为您将定义基属性价值,它定义了自定义合并驱动程序.

在本例中,“自定义合并驱动程序”是一个非常简单的脚本,它基本上将保持当前版本不变,因此允许您始终选择本地版本。

让我们在一个简单的场景(在Windows上使用msysgit 1.6.3)中,仅在DOS会话中测试它:cd f:\prog\git\test

mkdir copyMerge\dirWithConflicts

mkdir copyMerge\dirWithCopyMerge

cd copyMerge

git init

Initialized empty Git repository in F:/prog/git/test/copyMerge/.git/

现在,让我们创建两个文件,它们都有冲突,但合并的方式不同。echo a > dirWithConflicts\a.txt

echo b > dirWithCopyMerge\b.txt

git add -A

git commit -m "first commit with 2 directories and 2 files"

[master (root-commit) 0adaf8e] first commit with 2 directories and 2 files

我们将在两个不同的Git分支中在这两个文件的内容中引入一个“冲突”:git checkout -b myBranch

Switched to a new branch 'myBranch'

echo myLineForA >> dirWithConflicts\a.txt

echo myLineForB >> dirWithCopyMerge\b.txt

git add -A

git commit -m "add modification in myBranch"

[myBranch 97eac61] add modification in myBranch

git checkout master

Switched to branch 'master'

git checkout -b hisBranch

Switched to a new branch 'hisBranch'

echo hisLineForA >> dirWithConflicts\a.txt

echo hisLineForB >> dirWithCopyMerge\b.txt

git add -A

git commit -m "add modification in hisBranch"

[hisBranch 658c31c] add modification in hisBranch

现在,让我们尝试在“我的分支”上合并“他的分支”,并:冲突合并的手动解析

除为

dirWithCopyMerge\b.txt我一直想把

我的版本

b.txt.

因为合并发生在MyBranch,我们将切换到它,并添加‘gitattributes将自定义合并行为的指令。git checkout myBranch

Switched to branch 'myBranch'

echo b.txt merge=keepMine > dirWithCopyMerge\.gitattributes

git config merge.keepMine.name "always keep mine during merge"

git config merge.keepMine.driver "keepMine.sh %O %A %B"

git add -A

git commit -m "prepare myBranch with .gitattributes merge strategy"

[myBranch ec202aa] prepare myBranch with .gitattributes merge strategy

我们有一个.gitattributes中定义的文件。dirWithCopyMerge目录(仅在发生合并的分支中定义:myBranch),我们有一个.git\config文件,该文件现在包含合并驱动程序。[merge "keepMine"]

name = always keep mine during merge

driver = keepMine.sh %O %A %B

如果您还没有定义memMine.sh,并且无论如何启动合并,下面就是您得到的结果。git merge hisBranch

sh: keepMine.sh: command not found

fatal: Failed to execute internal merge

git st

# On branch myBranch

# Changed but not updated:

#   (use "git add ..." to update what will be committed)

#   (use "git checkout -- ..." to discard changes in working directory)

#

#       modified:   dirWithConflicts/a.txt

#

no changes added to commit (use "git add" and/or "git commit -a")

type dirWithConflicts\a.txt

a

<<<<<<

myLineForA

=======

hisLineForA

>>>>>>> hisBranch:dirWithConflicts/a.txt

这很好:a.txt已准备好进行合并,并在其中存在冲突。

b.txt,因为合并驱动程序应该负责处理它(因为在

.gitattributes(目录中的文件)。

定义keepMine.sh在你的任何地方%PATH%(或$PATH为了我们的Unix朋友。当然,我两者都做:我在VirtualBox会话中有一个Ubuntu会话)

如评论通过艾克兹,并在“合并策略“的一节自定义Git-Git属性,可以用shell命令替换shell脚本。true.git config merge.keepMine.driver true

但是在一般情况下,您可以定义一个脚本文件:

维普米恩.什# I want to keep MY version when there is a conflict

# Nothing to do: %A (the second parameter) already contains my version

# Just indicate the merge has been successfully "resolved" with the exit status

exit 0

(这是一个简单的合并驱动程序;)(在这种情况下,使用true)

(如果您想保留另一个版本,只需在exit 0行:

cp -f $3 $2.

就这样。您的合并驱动程序将始终保留来自另一个分支的版本,覆盖任何本地更改)

现在,让我们从头开始重试合并:git reset --hard

HEAD is now at ec202aa prepare myBranch with .gitattributes merge strategy

git merge hisBranch

Auto-merging dirWithConflicts/a.txt

CONFLICT (content): Merge conflict in dirWithConflicts/a.txt

Auto-merging dirWithCopyMerge/b.txt

Automatic merge failed; fix conflicts and then commit the result.

合并失败.。只适用于.txt.

编辑.txt,并离开“组分支”中的行,然后:git add -A

git commit -m "resolve a.txt by accepting hisBranch version"

[myBranch 77bc81f] resolve a.txt by accepting hisBranch version

让我们检查一下b.txt在这次合并过程中是否被保存下来。type dirWithCopyMerge\b.txt

b

myLineForB

最后一次提交表示满的合并:git show -v 77bc81f5e

commit 77bc81f5ed585f90fc1ca5e2e1ddef24a6913a1d

Merge: ec202aa 658c31c

git merge hisBranch

Already up-to-date.

(以合并开头的行确实证明了

考虑您可以定义、组合和/或覆盖合并驱动程序,如Git将:检查

.gitattributes在目录中

然后它检查

.gitattributes(它位于父目录中),只有在尚未设置的情况下才会设置指令。

最后,它审查了

$GIT_DIR/info/attributes..此文件用于重写树内设置.它会覆盖

所谓“合并”,我指的是“聚合”多个合并驱动程序。

尼克格林尝试,在评论中,以实际组合合并驱动程序:请参见“通过python git驱动程序合并pom".

但是,正如在他的另一个问题,它只在冲突情况下工作(在两个分支中并发修改)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/704050
推荐阅读
相关标签
  

闽ICP备14008679号