Skip to content

Commit

Permalink
git-merge-one-file: fix longstanding stupid thinko
Browse files Browse the repository at this point in the history
When a merge result creates a new file, and when our side already has a
file in the path, taking the merge result may clobber the untracked file.
However, the logic to detect this situation was totally the wrong way.  We
should complain when the file exists, not when the file does not exist.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
gitster committed Mar 19, 2008
1 parent deda26b commit 29dc133
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 2 deletions.
5 changes: 3 additions & 2 deletions git-merge-one-file.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,11 @@ case "${1:-.}${2:-.}${3:-.}" in
;;
"..$3")
echo "Adding $4"
test -f "$4" || {
if test -f "$4"
then
echo "ERROR: untracked $4 is overwritten by the merge."
exit 1
}
fi
git update-index --add --cacheinfo "$7" "$3" "$4" &&
exec git checkout-index -u -f -- "$4"
;;
Expand Down
46 changes: 46 additions & 0 deletions t/t1004-read-tree-m-u-wf.sh
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,50 @@ test_expect_success '3-way not overwriting local changes (their side)' '
'

test_expect_success 'D/F setup' '
git reset --hard &&
git checkout side-a &&
rm -f subdir/file2 &&
mkdir subdir/file2 &&
echo qfwfq >subdir/file2/another &&
git add subdir/file2/another &&
test_tick &&
git commit -m "side-a changes file2 to directory"
'

test_expect_success 'D/F' '
git checkout side-b &&
git read-tree -m -u branch-point side-b side-a &&
git ls-files -u >actual &&
(
a=$(git rev-parse branch-point:subdir/file2)
b=$(git rev-parse side-a:subdir/file2/another)
echo "100644 $a 1 subdir/file2"
echo "100644 $a 2 subdir/file2"
echo "100644 $b 3 subdir/file2/another"
) >expect &&
test_cmp actual expect
'

test_expect_success 'D/F resolve' '
git reset --hard &&
git checkout side-b &&
git merge-resolve branch-point -- side-b side-a
'

test_expect_success 'D/F recursive' '
git reset --hard &&
git checkout side-b &&
git merge-recursive branch-point -- side-b side-a
'

test_done

0 comments on commit 29dc133

Please sign in to comment.