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