Git Notes #3 [interactive rebase]

This is 3rd set of git notes.

It’s about magic command rebase in interactive mode with ability to suqash and related note about reset during rebase.

interactive-rebase-with-egit-5-638

reset

I have situation, when I made a few commits from Bitbucket web site, then pulled code to local working copy, made a few commits locally and pushed, then again a few commits from Bitbucket and pulled locally. So I ended up with a mess in commits tree. And I wanted to squash it. I wanted to use git rebase -i origin/master but I failed, because in fact git expected my current local commit to present. So that origin/master would be behind my local commits. But I didn’t have origin/master changes. So git answered me noop when I hit rebase.

So I decided to reset code. And I made it like this:

git reset --soft HEAD~6

In my case 6 – is number of commits, back to latest “normal” commit. In fact I could use SHA of that commit, which is 100% equal.
But the magic here is --soft, which in fact DOES reset git INDEX but update files with content of last commit I have. And it’s remain as “added for commit”.

Original explanation from git docs (git reset):

--soft
Does not touch the index file or the working tree at all (but resets the head to , just like all modes do). This leaves all your changed files “Changes to be committed”, as git status would put it.

and about “–hard”:

--hard
Resets the index and working tree. Any changes to tracked files in the working tree since are discarded.

 

squash => rebase => commit –allow-empty

You should definitely know “squash” awesome feature of git. I use it when I messed up with dozen commits locally, and I want to have only one, with proper commit message. I get used to this also.
But this time, I have situation, when there were commits with so called “empty content”.

Here is message from git, when I do git rebase -i HEAD~4 (where one commits was about empty file, removal):

You asked to amend the most recent commit, but doing so would make
it empty. You can repeat your command with –allow-empty, or you can
remove the commit entirely with “git reset HEAD^”.
rebase in progress; onto bacbdfc
You are currently rebasing branch ‘gh-pages’ on ‘bacbdfc’.

No changes

Could not apply 1fe14870b4461d2957e0468f45000228972b8b41… Updates

And this is info about –allow-empty param of commit command.

--allow-empty
Usually recording a commit that has the exact same tree as its sole parent commit is a mistake, and the command prevents you from making such a commit. This option bypasses the safety, and is primarily for use by foreign SCM interface scripts.

--allow-empty-message
Like –allow-empty this command is primarily for use by foreign SCM interface scripts. It allows you to create a commit with an empty commit message without using plumbing commands like git-commit-tree[1].

I faced with such situation first time. And in fact I made these steps to finish my rebase:

$ git rebase -i HEAD~4

add s/squash before commit messages and :wq
comment not needed commit messages
then git asked/told me about empty commits

$ git commit -m "Yes, I really do want those empty commits" --allow-empty
$ git rebase --continue

There is also info from git rebase command.

--keep-empty
Keep the commits that do not change anything from its parents in the result.

Not tired with this. Also not tried with git cherry-pick. So this is kinda TODO for the next time.

PS.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s