Read Anthropic’s case study about Graphite Reviewer

Git fast forward

Greg Foster
Greg Foster
Graphite software engineer


Note

This guide explains this concept in vanilla Git. For Graphite documentation, see our CLI docs.


Git, the distributed version control system, offers multiple ways to integrate changes from one branch into another. One such way is the Fast Forward merge. This guide aims to provide a comprehensive understanding of what a Fast Forward merge is, how it works, and when it should be used.


In a Fast Forward merge, Git moves the tip of the current branch forward to the tip of the target branch. This can only be done when the current branch is a direct ancestor of the target branch. This action maintains a linear history, as it does not create a new merge commit.

Terminal
# Visual Example
* commit H (HEAD -> feature)
|
* commit G
|
* commit F (master)

After a Fast Forward merge from master to feature:

Terminal
# Visual Example
* commit H (HEAD -> master, feature)
|
* commit G
|
* commit F

You should consider using a Fast Forward merge when:

  1. You want to maintain a linear history.

  2. There are no changes in the receiving branch since it diverged from the target branch.


To perform a Fast Forward merge, execute the following command:

Terminal
git merge --ff-only <branch_name>

In contrast to a Fast Forward merge, a No Fast Forward (--no-ff) merge will always create a new commit, even if a Fast Forward merge is possible.


  • Pulling in the latest changes from a remote tracking branch.

  • Merging feature branches that do not require a distinct merge commit.


  • Simplifies history by eliminating unnecessary merge commits.

  • Easier to follow changes and pinpoint issues.

  • Not suitable for recording distinct merge events.

  • Cannot be performed if there are diverging changes.


A: The --ff flag will perform a Fast Forward merge if possible, but if not, it will result in a merge commit. The --ff-only flag, on the other hand, will fail the merge operation if a Fast Forward merge cannot be performed, ensuring you don't accidentally create a merge commit.


A: Yes, you can undo a Fast Forward merge by resetting the branch pointer to the commit it pointed to before the merge. However, be cautious when doing this on shared branches as it rewrites history.

Terminal
git reset --hard <previous_commit_hash>

A: You can set Fast Forward merges as the default behavior by configuring your Git settings. Run the following command:

Terminal
git config --global merge.ff only

This will set Fast Forward merges as the default for all repositories on your system.


A: The concept of a Fast Forward merge is specific to Git's design and may not be present in other version control systems which might employ different strategies for handling merges.


A: A Fast Forward merge will not proceed if you have pending changes in your working directory, to avoid conflicts. You'll need to commit or stash your changes before performing a Fast Forward merge.


A: Generally, direct merges into protected branches are restricted and may require pull requests. Fast Forward merges are no exception and will usually be subject to the same branch protection rules.


A: Yes, in fact, rebasing inherently employs Fast Forwarding when moving commits to the tip of the branch you are rebasing onto. However, the term "Fast Forward" is generally not used in the context of rebasing.


A: This message appears when you're trying to perform a --ff-only merge, but the branches have diverged in a way that a Fast Forward merge is not possible. You will need to resort to a different merge strategy in this case.


A: Yes, Fast Forward merges work with Git submodules, but you'll need to be cautious about managing the pointers to ensure the submodules are updated correctly.


A: Git doesn't natively support merging multiple branches in a single command. However, you could script such an action, performing individual Fast Forward merges in sequence.


Understanding when and how to use a Fast Forward merge can optimize your Git workflow and maintain a cleaner, more linear history. It's a straightforward but potent strategy that, when used correctly, can make version control much more efficient.

Graphite
Git stacked on GitHub

Stacked pull requests are easier to read, easier to write, and easier to manage.
Teams that stack ship better software, faster.

Or install our CLI.
Product Screenshot 1
Product Screenshot 2