Collapsing a Group of Commits into One on Git

Git

Git Problem Overview


I have the habit of making a huge number of small commits, and I'm fine with it. But I would like to, from time to time, take a bunch of those linear commits and collapse them together as just one commit with the ability to write a new commit message.

I've looked into the documentation but seemed a little to cryptic to me. Does anybody knows how to do that?

Git Solutions


Solution 1 - Git

Assuming you don't care about retaining any of your existing commit messages, there's a nifty (and fast) git recipe you can use. First, make sure your branch is checked out:

git checkout <branch-to-squash>

For safety, lets tag the current commit.

git tag my-branch-backup

Next, move the branch HEAD back to your last good commit (without modifying the workspace or index). EDIT: The last good commit is the most recent commit on your branch that you want to retain.

git reset --soft <last-good-commit>

Using git status, you'll notice that all changes on your feature branch are now staged. All that's left to do is ...

git commit

This method is great for consolidating long, convoluted git histories and gnarly merges. Plus, there's no merge/rebase conflicts to resolve!

Now, if you need to retain any of your existing commit messages or do anything fancier than the above allows, you'll want to use git rebase --interactive.

Solution derived from: http://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

Reference: http://git-scm.com/docs/git-reset

Reference: http://git-scm.com/docs/git-rebase

Solution 2 - Git

Suppose you want to rewrite the history of the tree going back until (but not including) commit a739b0d.

export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive

Be sure to read up on interactive rebasing first.

Solution 3 - Git

Use the command git rebase -i <commit> where <commit> is the SHA for the last stable commit.

This will take you to your editor where you can replace the label pick that is next to each commit since the <commit> you included as an argument to your interactive rebase command. On the command you want to start collapsing at, replace pick with reword, and for each commit thereafter which you wish to collapse into it, replace pick with fixup. Save, and you'll then be allowed to provide a new commit message.

Solution 4 - Git

You can squash any number of commits into a single one using

git rebase --interactive <commit>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrrb_bbrView Question on Stackoverflow
Solution 1 - GitBen AmosView Answer on Stackoverflow
Solution 2 - GityfeldblumView Answer on Stackoverflow
Solution 3 - GitkevmoView Answer on Stackoverflow
Solution 4 - GitMatt BallView Answer on Stackoverflow