зеркало из https://github.com/microsoft/git.git
checkout -m path: fix recreating conflicts
We should tell ll_merge() that the 3-way merge between stages #2 and #3 is an outermost merge, not a virtual-ancestor creation. Back when this code was originally written, users couldn't write custom merge drivers easily, so the bug didn't matter, but these days it does. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
3273ebc759
Коммит
6d6f9acc5d
|
@ -179,7 +179,7 @@ static int checkout_merged(int pos, struct checkout *state)
|
|||
fill_mm(active_cache[pos+2]->sha1, &theirs);
|
||||
|
||||
status = ll_merge(&result_buf, path, &ancestor,
|
||||
&ours, "ours", &theirs, "theirs", 1);
|
||||
&ours, "ours", &theirs, "theirs", 0);
|
||||
free(ancestor.ptr);
|
||||
free(ours.ptr);
|
||||
free(theirs.ptr);
|
||||
|
|
|
@ -534,4 +534,61 @@ test_expect_success 'failing checkout -b should not break working tree' '
|
|||
|
||||
'
|
||||
|
||||
(
|
||||
echo "#!$SHELL_PATH"
|
||||
cat <<\EOF
|
||||
O=$1 A=$2 B=$3
|
||||
cat "$A" >.tmp
|
||||
exec >"$A"
|
||||
echo '<<<<<<< filfre-theirs'
|
||||
cat "$B"
|
||||
echo '||||||| filfre-common'
|
||||
cat "$O"
|
||||
echo '======='
|
||||
cat ".tmp"
|
||||
echo '>>>>>>> filfre-ours'
|
||||
rm -f .tmp
|
||||
exit 1
|
||||
EOF
|
||||
) >filfre.sh
|
||||
chmod +x filfre.sh
|
||||
|
||||
test_expect_success 'custom merge driver with checkout -m' '
|
||||
git reset --hard &&
|
||||
|
||||
git config merge.filfre.driver "./filfre.sh %O %A %B" &&
|
||||
git config merge.filfre.name "Feel-free merge driver" &&
|
||||
git config merge.filfre.recursive binary &&
|
||||
echo "arm merge=filfre" >.gitattributes &&
|
||||
|
||||
git checkout -b left &&
|
||||
echo neutral >arm &&
|
||||
git add arm .gitattributes &&
|
||||
test_tick &&
|
||||
git commit -m neutral &&
|
||||
git branch right &&
|
||||
|
||||
echo left >arm &&
|
||||
test_tick &&
|
||||
git commit -a -m left &&
|
||||
git checkout right &&
|
||||
|
||||
echo right >arm &&
|
||||
test_tick &&
|
||||
git commit -a -m right &&
|
||||
|
||||
test_must_fail git merge left &&
|
||||
(
|
||||
for t in filfre-common left right
|
||||
do
|
||||
grep $t arm || exit 1
|
||||
done
|
||||
exit 0
|
||||
) &&
|
||||
|
||||
mv arm expect &&
|
||||
git checkout -m arm &&
|
||||
test_cmp expect arm
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Загрузка…
Ссылка в новой задаче