73

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
  • 35,025
  • 12
  • 111
  • 136
Thomas S.
  • 5,804
  • 5
  • 37
  • 72
  • 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

69

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

There are two 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
LuxuryMode
  • 33,401
  • 34
  • 117
  • 188
Chris Maes
  • 35,025
  • 12
  • 111
  • 136
44

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
  • 28,386
  • 6
  • 101
  • 146
38

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,938
  • 1
  • 23
  • 33
Golfer
  • 481
  • 4
  • 3
12

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
  • 12,064
  • 3
  • 36
  • 47
8

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
  • 673
  • 7
  • 10
1

I miss the action rebase in your instruction:

git rebase -i <id-of-commit>
Bustikiller
  • 2,423
  • 2
  • 16
  • 34