git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Potential Bug: git merge overwrites uncommitted changes
@ 2015-02-17  4:26 Martin Maas
  0 siblings, 0 replies; only message in thread
From: Martin Maas @ 2015-02-17  4:26 UTC (permalink / raw)
  To: git

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@github.com: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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-02-17  4:26 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-17  4:26 Potential Bug: git merge overwrites uncommitted changes Martin Maas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).