Re: [HTCondor-devel] If you push to the HTCondor repo, please read this... (rebase vs merge)


Date: Tue, 28 Oct 2014 17:45:03 -0500
From: Alan De Smet <adesmet@xxxxxxxxxxx>
Subject: Re: [HTCondor-devel] If you push to the HTCondor repo, please read this... (rebase vs merge)
ASAP stop doing rebases when merging. It can create duplicate commits with different SHA1s.  This is actually happening in our repository:

https://htcondor-wiki.cs.wisc.edu/index.cgi/chngview?cn=41387
https://htcondor-wiki.cs.wisc.edu/index.cgi/chngview?cn=41474

When you merge from two different locations, the rebase will rewrite the previous rebase.  (To be fair, that's exactly what it's advertised as doing.) This can easily happen when working on a topic branch with another person and occasionally merging master into the branch. 

For the curious, the attached script creates a toy repository that exhibits the problem.

-- 
Alan De Smet                 Center for High Throughput Computing
adesmet@xxxxxxxxxxx                       http://chtc.cs.wisc.edu
#! /bin/sh

# Bail on failure
set -e

mkdir test.git
pushd test.git
git --bare init
popd

mkdir 1
pushd 1
git clone ../test.git
cd test
cp /etc/services ./
git add services 
git commit -m "Start"
git push
popd

mkdir 2
pushd 2
git clone ../test.git/
popd

mkdir 3
pushd 3
git clone ../test.git/
popd

pushd 2/test
git branch newbranch
git checkout newbranch
rm services
(echo "start" ; cat /etc/services) > services
git commit -a -m "add start"
git push --set-upstream origin newbranch
perl -pi -e 's/^start$/START/' services 
git commit -a -m "capitalize start"
popd

pushd 3/test
git pull
git checkout newbranch
echo end >> services
git commit -a -m "add end"
git push
popd

pushd 1/test
perl -pi -e 's/00/XX/' services 
git commit -a -m "00 to XX"
git push
popd

pushd 2/test
git fetch
git rebase origin/master
git rebase origin/newbranch
git checkout master
git pull
popd

pushd 2/test
cat <<END


The following two lines should identical, as they represent
the same commit. However, the "rebase merge" rewrote it, so 
now there are two distinct commits.

END
git log --grep XX | grep commit
git checkout newbranch > /dev/null 2>&1
git log --grep XX | grep commit
cat <<END

You can manually check this by going into 2/test and running:
git checkout master
git log --grep XX
git checkout newbranch 
git log --grep XX
END

[← Prev in Thread] Current Thread [Next in Thread→]