Re: [RFC] Rebasing merges: a jorney to the ultimate solution (Road Clear)
- From
- Igor Djordjevic <igor.d.djordjevic@gmail.com>
- Date
- Feb 28, 2018, 01:43 UTC
- Message-ID
- <6737f819-4629-8aef-c3fb-79d96ccd2306@gmail.com>
- In-Reply-To
- <8829c395-fb84-2db0-9288-f7b28fa0d0d1@gmail.com>
On 28/02/2018 02:33, Igor Djordjevic wrote:
Show 5 quoted lines
> > This seems to be working inside my (too trivial?) test case, for > interactive adding, dropping, and amending of rebased commits, > resulting "rebased" merge containing all the added/modified/dropped > changes, plus the original merge amendment, all as expected :P
In case anyone has a wish to examine my (now pretty messy) test script, here it is - sorry for not having time to clean it up! :(
What I get when I diff original and "rebased" merge is this:
diff --git a/test.txt b/test.txt
index a82470b..d458032 100644
--- a/test.txt
+++ b/test.txt
@@ -1,10 +1,14 @@
+A21
+A22
+A23
+A24
+A25
A1
A2
-B11
+B1111
A3
A4
A5
-B12
A6
A7
A8
@@ -14,6 +18,7 @@ A10
A11
A12
A13
+BX
A14
B2
A15... where A21 to A25 are additions due to new base, B11 was interactively amended to B1111, B12 was interactively dropped, and BX interactively added :)
We don`t see line X here, being an "evil merge" amendment being correctly preserved from original merge commit (thus not a difference). If we do `git show` of the "rebased" merge, we get this, as expected:
diff --cc test.txt
index b173cef,fad39a8..d458032
--- a/test.txt
+++ b/test.txt
@@@ -13,6 -13,6 +13,7 @@@ A
A7
A8
A9
++X
A10
A11
A12Regards, Buga
-- 8< -- #!/bin/sh
# rm -rf ./.git # rm -f ./test.txt
git init
touch ./test.txt git add -- test.txt
for i in {1..20}
do
echo A$i >>test.txt
git commit -am "A$i"
donegit checkout -b b1 sed -i '3iB11' test.txt git commit -am "B11" sed -i '7iB12' test.txt git commit -am "B12"
git checkout -b b2 HEAD^ sed -i '16iB2' test.txt git commit -am "B2"
git checkout -b merge b1 git merge --no-commit b2 sed -i '12iX' test.txt # amend merge commit git commit -am "M" git tag original-merge
git checkout master
for i in {1..5}
do
j=`expr "$i" + 20`
sed -i "${i}iA${j}" test.txt
git commit -am "A$j"
done# simple/naive demonstration of proposed merge rebasing logic # using described "Trivial Merge" (TM, or "Angel Merge"), # preserving merge commit manual amendments, but still respecting # interactively rebased added/modified/dropped commits :)
# read -p "Press enter to continue" git checkout b1 git cherry-pick -m1 original-merge && git tag U1 git reset --hard HEAD^^ # drop U1 and last b1 commit sed -i '/B11/c\B1111' test.txt git commit -a --amend --no-edit git rebase master git cherry-pick U1 && git tag U1-prime
# read -p "Press enter to continue" git checkout b2 git cherry-pick -m2 original-merge && git tag U2 git reset --hard HEAD^ # drop U2 git rebase master sed -i '20iBX' test.txt git commit -am "BX" # add new commit git cherry-pick U2 && git tag U2-prime
git diff U1 U1-prime | git apply --3way && git commit -m "U2-second" && git tag U2-second git checkout b1 git diff U2 U2-prime | git apply --3way && git commit -m "U1-second" && git tag U1-second
# read -p "Press enter to continue" git branch -f merge b1 git checkout merge git merge b2 --no-commit git commit -a --reuse-message original-merge git tag angel-merge
# read -p "Press enter to continue" git reset --hard b1^ git read-tree --reset angel-merge git update-ref refs/heads/merge "$(git show -s --format=%B original-merge | git commit-tree "$(git write-tree)" -p "$(git rev-parse b1^^)" -p "$(git rev-parse b2^^)")" git tag -f angel-merge git checkout angel-merge . git branch -f b1 b1^^ git branch -f b2 b2^^
# show resulting graph echo git log --all --decorate --oneline --graph
# comparison between original merge and rebased merge, # showing merge commit amendment "X" being preserved during rebase # (not shown in diff) echo echo 'diff original-merge angel-merge:' git diff original-merge angel-merge