Git合并冲突始终采用最新文件

时间:2011-09-30 07:16:36

标签: git git-merge

如何解决git冲突总是通过获取最新文件(最新更改的时间戳)得到解决,在没有提示的情况下完成?

我正在使用git后端构建一个syncscript,我从不想实际合并文件,只是覆盖所有旧版本与最后编辑/删除/添加的版本。

编辑:使用最新文件,我的意思是包含该文件的最新提交。

4 个答案:

答案 0 :(得分:5)

我找到了这个小合并驱动程序,可以完成我想要的工作。为了我的目的,它被硬编码到“主”分支和“原点”遥控器。我不知道如何使这些部件动态化。

#!/usr/bin/env sh
if git merge-file -p -q "$2" "$1" "$3" > /dev/null;
        then git merge-file "$2" "$1" "$3";
        else
                MINE=$(git log --format="%ct" --no-merges master -1);
                THEIRS=$(git log --format="%ct" --no-merges origin/master -1);
                if [ $MINE -gt $THEIRS ];
                        then git merge-file -q --ours "$2" "$1" "$3";
                        else git merge-file -q --theirs "$2" "$1" "$3";
                fi
fi

简而言之,我寻找最后一次使用不是合并的git-log提交,格式化为UNIX时间戳,然后我比较它们并运行与我们的eiter或他们的版本的自定义git-merge。

作为一点奖励,它首先检查是否可以合并文件而不会发生冲突。如果可以的话,它会合并两个文件。

答案 1 :(得分:3)

我认为你必须为此编写自己的合并驱动程序。有关如何执行此操作的详细信息,请参阅“git help gitattributes”,“定义自定义合并驱动程序”部分。

答案 2 :(得分:1)

基于@Lilleman的回答,该回答不错,但存在错误: 如果在本地主机上修改的文件早于Origin / master,则预期的行为是选择Origin / master,但如果在本地master上添加提交,它将选择文件的本地(旧版本)。 git log需要使用一个额外的参数(即文件路径)来执行。

这里有一个更好的版本,其中包含变量分支名称,虽然有点hacky,但是可以用

合并

#!/bin/sh
cd `findup .git`
PATH=$PATH:$( dirname "${BASH_SOURCE[0]}" )
HEAD=`git rev-parse --abbrev-ref HEAD`

echo "* merge=newest" > .gitattributes
sed -ie '/merge "newest"/,+2d' .git/config
echo "[merge \"newest\"]" >> .git/config
echo -e "\tname = Merge by newest commit" >> .git/config
echo -e "\tdriver = git-merge-newest %O %A %B %L %P $HEAD $1" >> .git/config
git merge $1
sed -ie '/merge "newest"/,+2d' .git/config
rm .gitattributes
cd - 

git-merge-newest

#!/bin/sh
if git merge-file -p -q "$2" "$1" "$3" > /dev/null;
        then git merge-file "$2" "$1" "$3";
        else
                MINE=$(git log --format="%ct" --no-merges "$6" -1 $5);
                THEIRS=$(git log --format="%ct" --no-merges "$7" -1 $5);
                if [ $MINE -gt $THEIRS ]; then
                  git merge-file -q --ours "$2" "$1" "$3" >/dev/null
                else
                  git merge-file -q --theirs "$2" "$1" "$3">/dev/null
                fi
fi

使用了findup

#!/bin/sh

pwd="`pwd`"
start="$pwd"
while [ ! "$pwd" -ef .. ]; do
[ -e "$1" ] && echo -n "$pwd" && exit
cd .. || exit 1
pwd="`pwd`"
done
exit 1

答案 3 :(得分:0)

如果有人来这里寻找解决方案以避免自动生成的文件(例如package-lock.jsonpubspec.lock*.pbxproj)引起的解决冲突,那么您可以创建一个.gitattributes定义合并策略的文件

package-lock.json merge=union

See more info on git attributes