[SCRIPT/RFC 1/3] setup.sh
flat view
From: Igor Djordjevic <hidden>
Date: 2017-11-26 23:01:40
On 26/11/2017 23:35, Igor Djordjevic wrote:
This is what we end up with once "master" and topic branches are
merged in merge commit M1 inside temporary "test" branch for further
integration testing:
(2) o---o---A (topicA)
/ \
/ M1 (test, HEAD)
/ /||
---o---o---M---/ || (master)
\ \ / |
\ o---B-/ | (topicB)
\ |
o---o---C--/ (topicC)To begin with, you can use provided "setup.sh"[*1*] script, putting you straight into position shown on graph (2) above, with addition of tag "A" and remote branch "origin/topicA" so you could try using these as "--onto-parent" values, too. As seen in there, change "X" is already made and staged, so you can now just run something like: git-commit--onto-parent.sh --onto-parent topicA ... to see the logic in action. Instead of "topicA", you may try providing tag "A", remote branch "origin/topicA" or even plain commit hash. It`s interesting to add "--amend" option into the mix, too, and see what happens. Also, you can try using "topicB" and see the commit fail (as it doesn`t merge cleanly). All this while "test.txt" file doesn`t get modified on disk (nor would any other file) - being desired behaviour, as we didn`t actually change anything inside the working tree, but just amended history of how we got here, so recompilation isn`t needlessly triggered :) p.s. Note these two lines near the end: sed -i '4iX1' test.txt # works with simple patch apply sed -i '17iX2' test.txt # needs three-way file merge You can play with it, commenting out one or the other and observing how it influences "git commit --onto-parent" in regards of the parent provided. Regards, Buga [*1*] "setup.sh", can clean previous setup run as well, but commented out here for safety, not to unexpectedly delete something for unwary user.
--- 8< ---#!/bin/sh
#rm -rf ./.git
#rm -f ./test.txt
git init
touch ./test.txt
git add -- test.txt
for i in {1..10}
do
echo $i >>test.txt
git commit -am "$i"
done
echo M >>test.txt
git commit -am "M"
git checkout -b topicA HEAD~2
for i in 1 2
do
sed -i "${i}iA${i}" test.txt
git commit -am "A$i"
done
sed -i '3iA' test.txt
git commit -am "A"
git tag A
# simulate remote branch
mkdir -p ./.git/refs/remotes/origin &&
echo $(git rev-parse HEAD^0) >$_/topicA
git checkout -b topicB master^
sed -i '4iB1' test.txt
git commit -am "B1"
sed -i '5iB' test.txt
git commit -am "B"
git checkout -b topicC master~2
for i in 1 2
do
j=`expr "$i" + 5`
sed -i "${j}iC${i}" test.txt
git commit -am "C$i"
done
sed -i "8iC" test.txt
git commit -am "C"
git checkout -b test master
git merge --no-edit topicA topicB topicC
sed -i '4iX1' test.txt # works with simple patch apply
sed -i '17iX2' test.txt # needs three-way file merge
git add -- test.txt
echo
git log --all --decorate --oneline --graph
echo
git diff --cached