Potential Bug: git merge overwrites uncommitted changes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

Teaching a university class using git, we encountered a case of
potentially incorrect behavior when students made changes to a file,
forgot to commit them, and then pulled a new one-line change from our
remote repository. This resulted in the uncommitted changes being
overwritten without a warning.

To our understanding, the expected behavior should have been a warning
that uncommitted files are being overwritten, or an auto-merge that
preserves the changes in the uncommitted files. Instead, git shows the
merge as a single-line change, while in reality discarding potentially
a large number of uncommitted lines.

I have attached a script that replicates this behavior -- we have been
able to replicate the problem with git versions 1.9.1, 1.9.3 and
2.2.2. Please let us know whether this is a bug, or whether this is
the intended behavior.

It appears that it is only this specific sequence of commands that
causes the behavior. Across a range of small modifications to the
sequence of steps, the behavior is as expected:

* using git cp and dropping the add step -> modifications preserved
* not doing commit 2 (or its changes) -> modifications live in new file
* any change in branch use other than test first master second ->
modifications preserved

(Asking colleagues, one of them pointed me to the following article
which describes a potentially related problem that appears to have
been fixed in 1.7.7:
http://benno.id.au/blog/2011/10/01/git-recursive-merge-broken)

Thanks,
Martin

---

git-test.sh: Run in a clean directory!

#!/bin/bash

# Replicate the two different states of hw2_starter, before and after
our update.
git clone git@xxxxxxxxxx:cs61c-spring2015/hw2_starter.git
cd hw2_starter
git checkout f8a2e4418b4c370921790d1dfd1b6f9761262d4a
git checkout -b test
cd ..

# Set up the cs61c-xx repository, and fetch "first" hw2_starter.
mkdir cs61c-test
cd cs61c-test
git init
git remote add hw2_starter ../hw2_starter/
git fetch hw2_starter
git merge hw2_starter/test -m "add hw2 changes"

# Perform a series of commits that some students accidentally did.
mkdir hw2
git mv hw1 hw2
git commit -a -m "commit 1"

cp hw2/hw1/* hw2/
git add hw2/*
git commit -a -m "commit 2"

# Now we make changes to the beargit.c file, but don't commit them.
for i in `seq 1 5`; do
echo "beargitcode line $i" >> hw2/beargit.c
done

echo
echo
echo " *** SHOULD HAVE A LINE CONTAINING beargitcode IN beargit.c ***"
echo
echo "CONTENT OF beargit.c | grep beargitcode BEFORE MERGE:"
cat hw2/beargit.c | grep beargitcode
echo "[EOF]"
echo

# Now we fetch the update, as we told students
git fetch hw2_starter
git merge hw2_starter/master -m "add hw2 changes"

# This should fail, because there are uncommitted changes!!!

echo
echo "CONTENT OF beargit.c | grep beargitcode AFTER MERGE:"
cat hw2/beargit.c | grep beargitcode
echo "[EOF]"
echo
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]