如何解决git冲突总是通过获取最新文件(最新更改的时间戳)得到解决,在没有提示的情况下完成?
我正在使用git后端构建一个syncscript,我从不想实际合并文件,只是覆盖所有旧版本与最后编辑/删除/添加的版本。
编辑:使用最新文件,我的意思是包含该文件的最新提交。
答案 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.json
,pubspec.lock
,*.pbxproj
)引起的解决冲突,那么您可以创建一个.gitattributes
定义合并策略的文件
package-lock.json merge=union