how to re-order commits in Git non-interactively
What non-interactive git command(s) achieve the change from Before to After?
In your case, you can rebase interactive: git rebase -i HEAD~4 Then you can just reorder your picks
For example lets add three more files to our branch:
git add A git commit -m "A" git add B git commit -m "B" git add C git commit -m "C"
Your shortlog will be:
$ git shortlog (3): A B C
If you want to reorder B with C:
$ git rebase -i HEAD~2 pick 1f9133d B pick 33f41be C
You just re-order them to be:
pick 33f41be C pick 1f9133d B
After you're done writing, see the shortlog:
$ git shortlog (3): A C B
You can do the same thing with all the commits by re-ordering. It is like what you see is what you get, which is pretty cool :)
git reset --hard A git cherry-pick C git cherry-pick B git cherry-pick D
There may be a way with git rebase, but I didn't really understand it.
See How do I run git rebase --interactive in non-interactive manner? for using git rebase --interactive in non-interactive manner.
Then, if you have formal criteria for reordering commits, you can script that, see for example Really flatten a git merge to reorder commits by the original commit date.