What Effect Does the --No-ff Flag Have for Git Merge?

Better Stack Team
Updated on August 12, 2024

The --no-ff flag for git merge affects how Git handles the merge process, specifically with regard to the creation of merge commits. Here's a detailed look at its impact:

What Does -no-ff Do?

When you use the --no-ff (no fast-forward) flag with git merge, Git ensures that a merge commit is created even if the merge could be resolved with a fast-forward. This flag is useful for maintaining a clear history of merges and is often used to preserve the context of feature branches.

How It Works

  • Fast-Forward Merge: By default, if you merge a branch into another branch and there have been no additional commits on the target branch since the branch being merged was created, Git performs a fast-forward merge. This means the branch pointer is simply moved forward to point to the tip of the feature branch, and no new commit is created.

     
    git checkout master
    git merge feature-branch
    

    If master has not diverged from feature-branch, the result is a fast-forward merge.

  • Non-Fast-Forward Merge (-no-ff): When you use the -no-ff flag, Git will create a merge commit even if a fast-forward merge is possible. This preserves the history of the feature branch as a distinct commit, providing a clearer record of when and why the feature was merged.

     
    git checkout master
    git merge --no-ff feature-branch
    

    In this case, Git creates a merge commit that has two parent commits: one pointing to the tip of master before the merge and one pointing to the tip of feature-branch. This commit helps to explicitly record the merge point in the history.

Benefits of Using -no-ff

  1. Preserves Branch History: Using -no-ff creates a merge commit that represents the integration of a feature branch into the main branch. This provides a clear record of the feature’s integration point and keeps the feature branch's history intact.
  2. Improves Context: With a merge commit, you can easily see the point in history where a feature branch was merged. This is particularly useful for understanding the context of changes and for tracking which features were included in specific commits.
  3. Eases Rollbacks: If you need to revert a feature, a merge commit provides a single point of reference. You can easily revert the merge commit to remove all changes introduced by the feature branch.
  4. Organizes History: It helps to keep the history of the main branch more organized and readable by grouping related changes together with a single merge commit.

Example

Consider a scenario where you have a feature-branch and you want to merge it into master:

  1. Before the Merge:

     
    master: A---B
    feature-branch: C---D
    
  2. Merge Without -no-ff (Fast-Forward):

     
    git checkout master
    git merge feature-branch
    

    Result:

     
    master: A---B---C---D
    

    The commits from feature-branch are added directly to master without a separate merge commit.

  3. Merge With -no-ff:

     
    git checkout master
    git merge --no-ff feature-branch
    

    Result:

     
    master:      A---B---M
                    /    \\
    feature-branch: C---D
    

    Here, M is the merge commit created by the --no-ff merge. It has two parent commits: one pointing to B and one pointing to D.

Summary

The --no-ff flag for git merge forces Git to create a merge commit even when a fast-forward merge is possible. This:

  • Preserves the history of the branch being merged.
  • Provides a clear record of when and why a branch was integrated.
  • Organizes the commit history and improves context.

Using --no-ff is especially useful in workflows where maintaining a detailed and organized history of feature branches is important.

Got an article suggestion? Let us know
Explore more
Git
Licensed under CC-BY-NC-SA

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Make your mark

Join the writer's program

Are you a developer and love writing and sharing your knowledge with the world? Join our guest writing program and get paid for writing amazing technical guides. We'll get them to the right readers that will appreciate them.

Write for us
Writer of the month
Marin Bezhanov
Marin is a software engineer and architect with a broad range of experience working...
Build on top of Better Stack

Write a script, app or project on top of Better Stack and share it with the world. Make a public repository and share it with us at our email.

community@betterstack.com

or submit a pull request and help us build better products for everyone.

See the full list of amazing projects on github