views:

86

answers:

1

Hi,

Current situation:

origin/mybranch --- A1 --- B1 --- A2 --- B2 --- A3 --- B3   mybranch

I want to clean that history up (A1 to B3), esp. since I have not pushed it anywhere yet and because I want to prepare a patch which just those B*.

What I want is:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3   mybranch

I probably will not push this at all (or if I will, only the summed B*, I must remove the A* commits at all) and while I am working further on this, I might get additional such commits, i.e. like this:

origin/mybranch --- A1+A2+A3 --- B1+B2+B3 --- A4 --- B4   mybranch

And I want to rewrite that then again like above.

I don't just want to know any method to do this (because I would be able to get sth like in a somewhat hacky way), I am esp. asking here for the right/best/cleanest/easiest way to do this.


What I am doing esp. is: I am working on the official xorg-xserver-1.7 branch and want to prepare a patch (B*). Because I want to be able to replace my self-compiled xserver with the system one for simple testing purpose, I have applied a bunch of Debian/Ubuntu patches (A*). However, when I am going to post that patch somewhere, I want to exclude those.

+3  A: 

You want to do an interactive rebase.

The first thing I like to do when trying out git commands is to make a backup copy of my branch:

$ git branch my-backup-branch

Let's say that your A1 commit has a hash of 152274b. Try this:

$ git rebase -i 152274b^

That command will bring up your editor (usually vim) with something like this:

pick 152274b A1
pick 14b0838 B1
pick 661b993 A2
pick a6510db B2
pick 557e171 A3
pick 85da0e4 B3

# Rebase 39a47e4..85da0e4 onto 39a47e4
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

From here you can change the order of the commits, delete them entirely and even squash them. In this example, you probably want to move and squash like this:

pick 152274b A1
s 661b993 A2
s 557e171 A3
pick 14b0838 B1
s a6510db B2
s 85da0e4 B3

Give it a try. If you end up in a state that you didn't want, you can always go back to the state you saved in your backup branch:

$ git reset --hard my-backup-branch
Neall
Wow, that was easy! :) So natural, elegant and perfect.
Albert