56

I have made a bunch of unpushed commits in my feature branch and now want to reorder and partly squash belonging commits visually. I reckon the solution somehow lies in the Git interactive, but how to invoke it?

$ git rebase --interactive --onto <the-ID-of-the-first-commit-to-rewrite>

just pops up the VI with a

noop

content followed by commented information. After exiting, my head is reset to the specified commit.

How to correctly trigger the interactive rebase for modifying the commits since a certain commit?

Chris Maes
  • 30,644
  • 6
  • 98
  • 124
Thomas S.
  • 4,924
  • 3
  • 28
  • 64
  • You're triggering it correctly, you just need to learn how to use it. Read the commented out section, it contains a brief explanation on what you should do. – Maroun Jan 04 '17 at 13:17

6 Answers6

55

you should use

git rebase --interactive <sha1>

where <sha1> should not be the sha of the first commit you want to rewrite, but the sha of the commit just before.

if your history looks like this:

pick 43576ef last commit
...
pick 5116d42 first commit to rewrite
pick cb85072 last good commit

then you can there are different ways to indicate the commit on which to rebase:

git rebase -i cb85072
git rebase -i 5116d42^

where

  • ^ means the commit just before.
  • -i is just short for --interactive
yunzen
  • 31,553
  • 11
  • 69
  • 98
Chris Maes
  • 30,644
  • 6
  • 98
  • 124
33

You can also step back from your last commit by some number of commits. For example, if you want to rebase last 5 commits you can use this command: git rebase -i HEAD~5.

sschuberth
  • 26,156
  • 6
  • 93
  • 139
27

To review and rewrite the last n commits, use:

git rebase -i HEAD~n

p, pick = use commit

f, fixup = like "squash", but discard this commit's log message

https://www.freecodecamp.org/forum/t/how-to-squash-multiple-commits-into-one-with-git-squash/13231

Apollys supports Monica
  • 2,457
  • 1
  • 19
  • 29
Golfer
  • 371
  • 3
  • 3
9

The accepted answer is right

Though, counting n commits to squash and picking the commit id for rebase is tricky

git rebase -i HEAD~[N]   // N is the number of commits, starting from the most recent one

enter image description here

git rebase -i HEAD~[7]

But if u have tons of commit to squash

git rebase -i [commit-id] // [commit-id] is the hash of the commit just before the first one 

git rebase -i 6394dc


Inspired by

bereket gebredingle
  • 8,858
  • 2
  • 30
  • 44
4

If you want to interactively rebase branch B onto branch A using its last N commits, you can generally do this:

git rebase -i --onto A B~N B

e.g.

git rebase -i --onto master feature~3 feature

Works well also non-interactively - without -i.

Martin Flaska
  • 403
  • 4
  • 7
1

I miss the action rebase in your instruction:

git rebase -i <id-of-commit>
Bustikiller
  • 2,418
  • 2
  • 14
  • 29