Is there a way to configure git so that git rebase --continue skips the "no changes" test?
I don't want git rebase --continue to ever fail because it detects no changes. It should automatically delete the commit when this happens.
Why?
I frequently run into the problem with git where I git rebase --continue fails because it sees no changes and requires me to say git rebase --skip. I understand why this happens, but it slows down my workflow and makes it more dangerous: if I'm doing a large rebase where the problem recurs multiple times, along with legitimate merge conflicts, I'm more likely to accidentally use a skip command from the history when I meant to reuse a continue command.
Example
Suppose I have the following history:
A -- B -- C -- D -- E -- F <-- topic
\
H -- I <-- master
and I want to push commits B, C, E, and F to the master branch in origin.
Suppose that when I cherry pick them, B works fine, C and F have some trivial merge conflict caused by commits H and I, and E has a non-trivial merge conflict that needs to be resolved differently if H and I are in the history than if D is in the history. After resolving those conflicts, suppose my history is:
A -- B -- C -- D -- E -- F <-- topic
\
H -- I -- B -- C' -- E'' -- F' <-- master
Now, I want to rebase my topic branch onto master. In doing so, B will get automatically dropped, but I'll get merge conflicts for C, E, and F because they were modified when they were cherry-picked. When the rebase pauses at C, resolving the conflicts results in no net change, so git will be defensive and complain when I try to run git rebase --continue:
No changes - did you forget to use 'git add'?
The solution is to use git rebase --skip instead. At that point, E will conflict; resolving it requires actual changes, so I actually (and successfully) use git rebase --continue. Then, F produces another spurious merge conflict. As with C, resolving that conflict results in no net changes, so again I'm told to use skip mode when I try to continue.
I'd like to configure git so that when I resolve a merge conflict (esp. with mergetool) and the resolution results in no net changes, I want git rebase --continue to just do the work of git rebase --skip, at most prompting me. I'd prefer it always auto-skip if it can't be smart enough to know that I ran the mergetool. The continue option seems to be defending against incorrect git checkout commands mid-rebase; I'm familiar enough with git these days to never be in danger of accidentally nuking changes mid-rebase. I have however come close to accidentally doing a skip when my history looks like this:
git rebase # start the rebase
git mergetool # apply non-trivial fix
git rebase --continue # succeeds: non-trivial fix
git mergetool # apply non-trivial fix
git rebase --continue # succeeds: non-trivial fix
git mergetool # apply non-trivial fix
git rebase --continue # succeeds: non-trivial fix
git mergetool # nuke all changes from the topic branch
git rebase --continue # fails: no changes
git rebase --skip # this should have been automatic
git mergetool # apply non-trivial fix (THIS MUST NOT BE SKIPPED)
... here I have to be careful and not just reflexively hit up-arrow twice then <ENTER>...
Interesting question. Here Automatically skip empty commits when using git rebase user Olivier Refalo suggested using a function from G2, simplified git interface for newbies. Basically it boils down to checking whether contents of files in index is different from files the repository after doing git add. If it's different do git rebase --continue, if it's the same do git rebase --skip. You could create script that would do the following:
#!/bin/sh
if git diff-index --quiet HEAD --; then
git rebase --skip
else
git rebase --continue
fi
Alternatively you can add an alias to your .gitconfig:
[alias]
reb = "!if git diff-index --quiet HEAD --; then git rebase --skip; else git rebase --continue; fi"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With