Merge
This document explains the concept of fast forward and no fast forward merges in Git, as illustrated in the provided diagram.
Explanation
Initial State
Initially, we have two branches: master
and dev
.
graph TD; A[Task 1]:::task --> B[Task 2]:::task B --> C[Task 3]:::task C --> D[Final Task]:::finalTask C --> master[Master Branch]:::branch D --> dev[Development Branch]:::branch classDef finalTask fill:#90ee90, stroke:#000, stroke-width:2px; classDef branch fill:#f08080, stroke:#000, stroke-width:2px; linkStyle 0 stroke:#2ca02c,stroke-width:2px linkStyle 1 stroke:#2ca02c,stroke-width:2px linkStyle 2 stroke:#2ca02c,stroke-width:2px linkStyle 3 stroke:#0000FF,stroke-width:2px linkStyle 4 stroke:#0000FF,stroke-width:2px
Fast Forward Merge
When the master
branch is merged into the dev
branch and there are no new commits in the master
branch, we can perform a fast forward merge. This will move the master
branch pointer to the latest commit in the dev
branch.
graph TD; A[Task A]:::task --> B[Task B]:::task B --> C[Task C]:::task C --> D[Final Task]:::finalTask D --> dev[Development Branch]:::branch D --> master[Master Branch]:::branch classDef task fill:#add8e6, stroke:#000, stroke-width:2px; classDef finalTask fill:#90ee90, stroke:#000, stroke-width:2px; classDef branch fill:#f08080, stroke:#000, stroke-width:2px; linkStyle 0 stroke:#2ca02c,stroke-width:2px linkStyle 1 stroke:#2ca02c,stroke-width:2px linkStyle 2 stroke:#2ca02c,stroke-width:2px linkStyle 3 stroke:#0000FF,stroke-width:2px linkStyle 4 stroke:#0000FF,stroke-width:2px
No Fast Forward Merge
If there are new commits in the master
branch, a merge commit is created to combine the histories of the master
and dev
branches. This results in a no fast forward merge.
graph TD; A[Task A]:::task --> B[Task B]:::task B --> C[Task C]:::task C --> M[Merge Commit]:::merge C --> D[Final Task]:::finalTask M --> master[Master Branch]:::branch D --> dev[Development Branch]:::branch M --> D; classDef task fill:#add8e6, stroke:#000, stroke-width:2px; classDef finalTask fill:#90ee90, stroke:#000, stroke-width:2px; classDef merge fill:#ffcc00, stroke:#000, stroke-width:2px; classDef branch fill:#ff7f50, stroke:#000, stroke-width:2px; linkStyle 0 stroke:#2ca02c,stroke-width:2px linkStyle 1 stroke:#2ca02c,stroke-width:2px linkStyle 2 stroke:#ff4500,stroke-width:2px linkStyle 3 stroke:#2ca02c,stroke-width:2px linkStyle 4 stroke:#0000ff,stroke-width:2px linkStyle 5 stroke:#0000ff,stroke-width:2px
Commands
To perform a fast forward merge:
# Switch to master branch
git checkout master
# Merge dev branch into master
git merge dev
Optionally, you may choose to delete the feature branch after merging:
git branch -d dev # Delete the local `develop` branch
git push origin --delete dev # Delete the remote `develop` branch
To ensure no fast forward merge:
# Switch to master branch
git checkout master
# Merge dev branch into master with no fast forward option
git merge --no-ff dev
Summary
- Fast Forward Merge: Moves the branch pointer forward without creating a new commit.
- No Fast Forward Merge: Combines branch histories and creates a new merge commit.