So occasionally you might be working with people who have a less-than-stellar grasp of version control, who merge an old branch with --ours or worse - copy paste their entire repo deleting all the work of the last month.

Was that a bit too specific? Anyway, when this happens you might run into a group of commits you need to revert.

Ordinarily this is just git revert fecced but if there are multiple merge commits and normal commits mixed in with all sorts of nightmares you might want a reset. Unfortunately, a reset implies a force push which is a bad thing™ for many reasons.

If only there was a way to make a revert commit.

Introducing! git commit-reset

This is an alias that will make a commit that "Reverts" the current branch to a previous commit. It effectively undoes everything and sets your whole tree to that version.

Before:

$ git log --oneline --stat
e0c202d Fuck everything up, but worse
 file | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
3251311 Fuck everything up
 file | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
0587e18 Change file
 file | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
6c33024 Add file
 file | 1 +
 1 file changed, 1 insertion(+)
$ git rev-parse HEAD^{tree}
b97b0c91c61e8fe3fc9a956797d12309d45710ec
$ git rev-parse HEAD^^{tree}
eb27a12891913c01d03907cbe6f9f8cdb7d65135
$ git rev-parse HEAD^^^{tree}
8be01bfae71f0b75c6dab647f283af4ede77ae06

Command:

$ git commit-reset 0587e18 Unfuck stuff
Updating e0c202d..dcdd38b
Fast-forward
 file | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

After:

$ git log --oneline --stat
dcdd38b Unfuck stuff
 file | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
e0c202d Fuck everything up, but worse
 file | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
3251311 Fuck everything up
 file | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)
0587e18 Change file
 file | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
6c33024 Add file
 file | 1 +
 1 file changed, 1 insertion(+)
$ git rev-parse HEAD^{tree}
8be01bfae71f0b75c6dab647f283af4ede77ae06