enhance: respect git config merge.ff (#1495)

This adds another configuration possibility for the default merge mode
to the already existing per branch git configuration
`branch.<name>.mergeoptions` (#540) and the per repo preference
"Preferred Merge Mode" (#1156).

Defined values:
 - `false`: do no fast-forward merge
 - `only`: do only a fast-forward merge

This is configurable by for example `git config set --global merge.ff
<value>` for a global (meaning the current user) configuration.

The priority between these configurations/preferences is:

 - git configuration `branch.<name>.mergeoptions` (#540)
 - git configuration `merge.ff`
 - preference "Preferred Merge Mode" (#1156)
This commit is contained in:
Sina Hinderks
2025-07-03 04:20:44 +02:00
committed by GitHub
parent b7d1f936a8
commit 626a20ac97
2 changed files with 55 additions and 18 deletions

View File

@@ -2,13 +2,28 @@
{
public class MergeMode
{
public static readonly MergeMode Default =
new MergeMode("Default", "Fast-forward if possible", "");
public static readonly MergeMode FastForward =
new MergeMode("Fast-forward", "Refuse to merge when fast-forward is not possible", "--ff-only");
public static readonly MergeMode NoFastForward =
new MergeMode("No Fast-forward", "Always create a merge commit", "--no-ff");
public static readonly MergeMode Squash =
new MergeMode("Squash", "Squash merge", "--squash");
public static readonly MergeMode DontCommit
= new MergeMode("Don't commit", "Merge without commit", "--no-ff --no-commit");
public static readonly MergeMode[] Supported =
[
new MergeMode("Default", "Fast-forward if possible", ""),
new MergeMode("Fast-forward", "Refuse to merge when fast-forward is not possible", "--ff-only"),
new MergeMode("No Fast-forward", "Always create a merge commit", "--no-ff"),
new MergeMode("Squash", "Squash merge", "--squash"),
new MergeMode("Don't commit", "Merge without commit", "--no-ff --no-commit"),
Default,
FastForward,
NoFastForward,
Squash,
DontCommit,
];
public string Name { get; set; }

View File

@@ -34,7 +34,7 @@ namespace SourceGit.ViewModels
Source = source;
Into = into;
Mode = forceFastForward ? Models.MergeMode.Supported[1] : AutoSelectMergeMode();
Mode = forceFastForward ? Models.MergeMode.FastForward : AutoSelectMergeMode();
}
public Merge(Repository repo, Models.Commit source, string into)
@@ -82,27 +82,49 @@ namespace SourceGit.ViewModels
}
private Models.MergeMode AutoSelectMergeMode()
{
return
GetGitConfigBranchMergeOptions()
?? GetGitConfigMergeFF()
?? GetSettingsPreferredMergeMode();
}
private Models.MergeMode GetSettingsPreferredMergeMode()
{
var preferredMergeModeIdx = _repo.Settings.PreferredMergeMode;
if (preferredMergeModeIdx < 0 || preferredMergeModeIdx > Models.MergeMode.Supported.Length)
preferredMergeModeIdx = 0;
var defaultMergeMode = Models.MergeMode.Supported[preferredMergeModeIdx];
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
if (string.IsNullOrEmpty(config))
return defaultMergeMode;
if (config.Equals("--ff-only", StringComparison.Ordinal))
return Models.MergeMode.Supported[1];
if (config.Equals("--no-ff", StringComparison.Ordinal))
return Models.MergeMode.Supported[2];
if (config.Equals("--squash", StringComparison.Ordinal))
return Models.MergeMode.Supported[3];
if (config.Equals("--no-commit", StringComparison.Ordinal) || config.Equals("--no-ff --no-commit", StringComparison.Ordinal))
return Models.MergeMode.Supported[4];
return defaultMergeMode;
}
private Models.MergeMode GetGitConfigMergeFF()
{
var config = new Commands.Config(_repo.FullPath).Get("merge.ff");
return config switch
{
null or "" => null,
"false" => Models.MergeMode.NoFastForward,
"only" => Models.MergeMode.FastForward,
_ => null
};
}
private Models.MergeMode GetGitConfigBranchMergeOptions()
{
var config = new Commands.Config(_repo.FullPath).Get($"branch.{Into}.mergeoptions");
return config switch
{
null or "" => null,
"--ff-only" => Models.MergeMode.FastForward,
"--no-ff" => Models.MergeMode.NoFastForward,
"--squash" => Models.MergeMode.Squash,
"--no-commit" or "--no-ff --no-commit" => Models.MergeMode.DontCommit,
_ => null
};
}
private readonly Repository _repo = null;
private readonly string _sourceName;
}