git rebase: retain original head?
Hello, I frequently run an interactive rebase to change the order of recent commits, apply fixups, etc. When merge conflicts occur I often want to compare the result with the original head prior to starting the rebase. In the past I used "git diff ORIG_HEAD". This used to work as long as I did not manually invoke "git reset" during the operation. Since git version 2.20.1 (not sure, maybe 2.20.0?) this no longer works because ORIG_HEAD seems to get modified by fixup commits during rebase. Now I have to search through reflog to find the commit I want to compare the current head to. During the rebase operation the original head seems to get stored in 'rebase-merge/orig-head'. Unfortunately this references gets removed after the rebase operation completes. Would it be possible to retain this information? Could you set ORIG_HEAD back to rebase-merge/orig-head after rebase completes? Alternatively, could something like REBASE_HEAD be added for this purpose? Undoing a rebase would be related to this and is a very popular question on SO [1]. Users recommend using "git reset --hard ORIG_HEAD" which now no longer works. Regards, Markus [1] https://stackoverflow.com/questions/134882
Re: git rebase: retain original head?
On Tue, Jan 8, 2019 at 6:43 PM Andreas Schwab wrote: > > On Jan 08 2019, Markus Wiederkehr wrote: > > > Would it be possible to retain this information? > > You could use the reflog of the current branch, where it is the second > entry. It is not, depending on what happens in the rebase it could be any entry. That's why I always have to search for the right one, which is tedious. Example: $ git rebase -i root-tag ... (apply one fixup) $ git reflog 906caf1c (HEAD -> master) HEAD@{0}: rebase -i (finish): returning to refs/heads/master 4906caf1c (HEAD -> master) HEAD@{1}: rebase -i (pick): qux 85dab37b4 HEAD@{2}: rebase -i (pick): baz 7de7420d2 HEAD@{3}: rebase -i (fixup): bar 9bc0461c0 HEAD@{4}: rebase -i (start): checkout root-tag a150b73ca HEAD@{5}: commit: foo Here I have to use HEAD@{5}. Markus On Tue, Jan 8, 2019 at 6:43 PM Andreas Schwab wrote: > > On Jan 08 2019, Markus Wiederkehr wrote: > > > During the rebase operation the original head seems to get stored in > > 'rebase-merge/orig-head'. Unfortunately this references gets removed > > after the rebase operation completes. > > > > Would it be possible to retain this information? > > You could use the reflog of the current branch, where it is the second > entry. > > Andreas. > > -- > Andreas Schwab, sch...@linux-m68k.org > GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1 > "And now for something completely different."
Re: git rebase: retain original head?
On Tue, Jan 8, 2019 at 10:29 PM Andreas Schwab wrote: > > On Jan 08 2019, Markus Wiederkehr wrote: > > > It is not, depending on what happens in the rebase it could be any > > entry. > > Don't look at the HEAD reflog, use the branch reflog, ie. @{1}. That's exactly what I was looking for, thanks!
Re: git rebase: retain original head?
On Wed, Jan 9, 2019 at 3:05 PM Johannes Schindelin wrote: > > Having said that, it is an unintended regression in the built-in rebase. > Markus, could you come up with a minimal test case, preferably in the form > of a patch to t/t3415-rebase-autosquash.sh? I don't think I'm familiar enough with the test code to be able to provide a good patch but the following code should illustrate the regression. git init testrepo cd testrepo echo 1 > file && git add file && git commit -m "initial" echo 1 >> file && git commit -am "commit 1" # rev_commit_1=$(git rev-parse HEAD) echo 1 >> file && git commit -am "fixup! $(git rev-parse --short HEAD)" echo 1 >> file && git commit -am "commit 3" rev_orig_head=$(git rev-parse HEAD) GIT_EDITOR=: git rebase --autosquash -i HEAD~3 test $(git rev-parse ORIG_HEAD) = $rev_orig_head In older versions of git this test succeeded, i.e. ORIG_HEAD pointed to the previous original head, $rev_orig_head. In git version 2.20.1 ORIG_HEAD now points to the commit that got fixuped instead, $rev_commit_1. In previous versions ORIG_HEAD only pointed somewhere else if "git reset" was invoked manually during the rebase operation. I'm not sure if this is desirable, maybe ORIG_HEAD should always point to the previous head after rebase completes, no matter what operations were run in between. What do you think? Markus