Git Rebasing

Git rebase is a powerful command that allows developers to reshape and refine commit history. Unlike merging, which combines divergent branches, rebasing integrates changes by moving or combining commits.We'll explore the various ways to use the git rebase command, providing you with a comprehensive guide to streamlining your Git history and creating a cleaner, more coherent repository.

1. Basic Interactive Rebasing:

The fundamental use of git rebase involves interactively rebasing your branch onto another branch:

bash
git rebase -i <base-branch>

Replace <base-branch> with the branch onto which you want to rebase your current branch. The interactive mode allows you to pick, squash, edit, and reorder commits.

2. Squashing Commits:

To squash multiple commits into a single commit during interactive rebase:

bash
git rebase -i <base-branch>

In the interactive editor, change "pick" to "squash" or simply "s" for the commits you want to squash. This combines the selected commits into one.

3. Editing Commits:

If you need to edit a commit during rebase:

bash
git rebase -i <base-branch>

Change "pick" to "edit" or simply "e" for the commit you want to edit. After making changes, use git add to stage them and then:

bash
git rebase --continue

This continues the rebase process.

4. Reordering Commits:

To change the order of commits during interactive rebase:

bash
git rebase -i <base-branch>

In the interactive editor, rearrange the order of "pick" lines. This alters the order in which the commits will be applied.

5. Skipping Commits:

To skip a commit during rebase:

bash
git rebase -i <base-branch>

Change "pick" to "skip" or simply "s" for the commit you want to skip. This excludes the specified commit from the rebased history.

6. Splitting Commits:

If you need to split a commit into smaller commits during rebase:

bash
git rebase -i <base-branch>

Change "pick" to "edit" or simply "e" for the commit you want to split. After making changes and staging them, use:

bash
git reset HEAD~

This uncommits the changes. Then, selectively add and commit portions of the changes.

7. Rebasing Onto a Specific Commit:

To rebase onto a specific commit instead of a branch:

bash
git rebase -i <target-commit>

Replace <target-commit> with the hash of the commit onto which you want to rebase.

8. Interactive Rebase with Autosquash:

To automatically squash commits marked with "fixup!" or "squash!" during interactive rebase:

bash
git rebase -i --autosquash <base-branch>

The autosquash flag simplifies the process of combining related commits.

9. Rebasing a Range of Commits:

To rebase a range of commits onto a specific commit or branch:

bash
git rebase -i <base-branch>~<n>

Replace <n> with the number of commits you want to rebase.

10. Preserving Merge Commits:

When rebasing, you can preserve merge commits:

bash
git rebase -p <base-branch>

The -p or --preserve-merges option ensures that merge commits are maintained in the rebased history.

11. Rebasing Interactive Mode on Merge Commits:

To rebase interactively with merge commits included:

bash
git rebase -i --rebase-merges <base-branch>

This allows for interactive rebase operations on branches that include merges.

12. Rebasing a Detached HEAD:

To rebase a detached HEAD onto a specific commit:

bash
git rebase -i <target-commit>

This is useful for refining the history of a specific commit.