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