Chuck's Academy

Conflict Resolution in Git

Merge Strategies in Git

Merge strategies in Git are fundamental for efficiently combining changes from different branches with minimal conflicts. Although Git tries to resolve merges automatically, sometimes manual intervention is necessary. Below, we explore the most common merge strategies and how to apply them.

Merge Strategy: Fast-Forward

The "fast-forward" merge is used when the target branch can advance directly to the point of the source branch without creating a merge commit. This happens when no additional commits have been made in the target branch since it diverged.

bash

If main has no additional commits since feature was created, the merge will be a fast-forward.

Merge Strategy: Recursive

The recursive strategy is the default in Git. It is used when the branches have different histories and a fast-forward is not possible. This strategy combines the branches by creating a merge commit.

bash

By using --no-ff, you force the creation of a merge commit, even if a fast-forward is possible.

Merge Strategy: Ours

The "ours" strategy is used in cases where you want to keep all the changes in your current branch and discard those of the merged branch. It is useful in situations where you know your branch has the correct implementation:

bash

Merge Strategy: Theirs

Git doesn't directly provide a "theirs" option on the command line. However, you can achieve the same effect by manually resolving each conflict in favor of the incoming changes. This is useful when you know the branch being merged has the correct changes.

bash

Merge Strategy: Octopus

The "octopus" strategy is used when combining more than two branches. It is especially useful in large projects with multiple feature branches. However, it is not recommended for merges with complex conflicts.

bash

Placeholder for Explanatory Image

Rebase Strategy

Rebase is an alternative to merge that is used to re-apply your commits on top of another branch, providing a cleaner and more linear commit history.

bash

By rebasing feature onto main, Git takes the commits in feature and applies them on top of main, resulting in a cleaner history.

Example of Conflict Resolution in Rebase

If you encounter a conflict during rebase:

bash

Git will pause at the conflicting commit, allowing you to resolve the conflict:

bash

If you decide not to continue with the rebase, you can abort it:

bash

When to Use Each Strategy?

  • Fast-Forward: When no divergent changes have been made and you want to keep the history.
  • Recursive: For standard merges when both branches have diverged.
  • Ours: When you want to prioritize changes from your branch.
  • Theirs: When you want to prioritize changes from the merged branch.
  • Octopus: To merge multiple branches at once, useful in large integrations.
  • Rebase: To maintain a clean and linear commit history.

Tips for Effective Merges

  • Review the History Before Merging: Use git log to understand the commit history.
  • Use Feature Branches: Keep work separated and easy to integrate.
  • Resolve Conflicts Immediately: Do not leave conflicts unresolved; they may become more complex over time.
  • Constant Communication: Keep the team informed about the status of merges and conflicts.

In the upcoming chapters, we will apply these strategies in practical examples and see how to use specific tools to resolve conflicts that may arise.


Ask me anything