--- title: Using Git rebase on the command line redirect_from: - /articles/using-git-rebase - /articles/using-git-rebase-on-the-command-line - /github/using-git/using-git-rebase-on-the-command-line - /github/getting-started-with-github/using-git-rebase-on-the-command-line - /github/getting-started-with-github/using-git/using-git-rebase-on-the-command-line intro: Here's a short tutorial on using `git rebase` on the command line. versions: fpt: '*' ghes: '*' ghec: '*' shortTitle: Git rebase --- ## Using Git rebase In this example, we will cover all of the `git rebase` commands available, except for `exec`. We'll start our rebase by entering `git rebase --interactive HEAD~7` on the terminal. Our favorite text editor will display the following lines: ```text pick 1fc6c95 Patch A pick 6b2481b Patch B pick dd1475d something I want to split pick c619268 A fix for Patch B pick fa39187 something to add to patch A pick 4ca2acc i cant' typ goods pick 7b36971 something to move before patch B ``` In this example, we're going to: * Squash the fifth commit (`fa39187`) into the `"Patch A"` commit (`1fc6c95`), using `squash`. * Move the last commit (`7b36971`) up before the `"Patch B"` commit (`6b2481b`), and keep it as `pick`. * Merge the `"A fix for Patch B"` commit (`c619268`) into the `"Patch B"` commit (`6b2481b`), and disregard the commit message using `fixup`. * Split the third commit (`dd1475d`) into two smaller commits, using `edit`. * Fix the commit message of the misspelled commit (`4ca2acc`), using `reword`. Phew! This sounds like a lot of work, but by taking it one step at a time, we can easily make those changes. To start, we'll need to modify the commands in the file to look like this: ```text pick 1fc6c95 Patch A squash fa39187 something to add to patch A pick 7b36971 something to move before patch B pick 6b2481b Patch B fixup c619268 A fix for Patch B edit dd1475d something I want to split reword 4ca2acc i cant' typ goods ``` We've changed each line's command from `pick` to the command we're interested in. Now, save and close the editor; this will start the interactive rebase. Git skips the first rebase command, `pick 1fc6c95`, since it doesn't need to do anything. It goes to the next command, `squash fa39187`. Since this operation requires your input, Git opens your text editor once again. The file it opens up looks something like this: ```text # This is a combination of two commits. # The first commit's message is: Patch A # This is the 2nd commit message: something to add to patch A # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: a # ``` This file is Git's way of saying, "Hey, here's what I'm about to do with this `squash`." It lists the first commit's message (`"Patch A"`), and the second commit's message (`"something to add to patch A"`). If you're happy with these commit messages, you can save the file, and close the editor. Otherwise, you have the option of changing the commit message by simply changing the text. When the editor is closed, the rebase continues: ```text pick 1fc6c95 Patch A squash fa39187 something to add to patch A pick 7b36971 something to move before patch B pick 6b2481b Patch B fixup c619268 A fix for Patch B edit dd1475d something I want to split reword 4ca2acc i cant' typ goods ``` Git processes the two `pick` commands (for `pick 7b36971` and `pick 6b2481b`). It _also_ processes the `fixup` command (`fixup c619268`), since it doesn't require any interaction. `fixup` merges the changes from `c619268` into the commit before it, `6b2481b`. Both changes will have the same commit message: `"Patch B"`. Git gets to the `edit dd1475d` operation, stops, and prints the following message to the terminal: ```shell You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue ``` At this point, you can edit any of the files in your project to make any additional changes. For each change you make, you'll need to perform a new commit, and you can do that by entering the `git commit --amend` command. When you're finished making all your changes, you can run `git rebase --continue`. Git then gets to the `reword 4ca2acc` command. It opens up your text editor one more time, and presents the following information: ```text i cant' typ goods # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD^1 <file>..." to unstage) # # modified: a # ``` As before, Git is showing the commit message for you to edit. You can change the text (`"i cant' typ goods"`), save the file, and close the editor. Git will finish the rebase and return you to the terminal. ## Pushing rebased code to GitHub Since you've altered Git history, the usual `git push origin` **will not** work. You'll need to modify the command by "force-pushing" your latest changes: ```shell # Don't override changes $ git push origin main --force-with-lease # Override changes $ git push origin main --force ``` > [!WARNING] > Force pushing has serious implications because it changes the historical sequence of commits for the branch. Use it with caution, especially if your repository is being accessed by multiple people. ## Further reading * [AUTOTITLE](/get-started/using-git/resolving-merge-conflicts-after-a-git-rebase)