如何使git冲突始终通过获取最新的文件(最新更改时间戳)来解决,完全不需要提示?
我正在使用git后端构建同步脚本,我永远不想合并文件,只想使用最后编辑/删除/添加的那个文件覆盖所有旧的副本。
编辑:最新的文件是指包含该文件的最新提交。
如何使git冲突始终通过获取最新的文件(最新更改时间戳)来解决,完全不需要提示?
我正在使用git后端构建同步脚本,我永远不想合并文件,只想使用最后编辑/删除/添加的那个文件覆盖所有旧的副本。
编辑:最新的文件是指包含该文件的最新提交。
#!/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/config
中来定义它作为自定义合并驱动程序吗? - kgutwin基于@Lilleman的答案,虽然不错但存在一个bug:
如果文件在本地主分支上修改,但比origin/master旧,则期望的行为是选择origin/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
package-lock.json
、pubspec.lock
、*.pbxproj
)引起的冲突,那么您可以创建一个.gitattributes
文件来定义合并策略。package-lock.json merge=union