Jguer/yay · error

error merging

Error message

error merging %s: %s

What it means

This error is thrown by gitMerge in pkg/sync/workdir/merge.go when a `git merge --no-edit --ff` command executed against a diff directory fails. It wraps the git stderr into a localized message identifying which directory failed to merge. It is raised while merging saved PKGBUILD diffs during package sync.

Solutions

  1. Read the stderr embedded in the error to see the git failure reason
  2. Delete the affected diff directory (e.g. ~/.local/share/yay/<pkg>) so it is recreated from scratch
  3. Run `git -C <dir> status` / `git -C <dir> merge --abort` to clean a conflicted worktree
  4. Ensure git is installed and configured
  5. Re-run the yay operation

Example fix

// before: conflicted diff dir blocks every sync
$ yay -S linux
error merging /home/u/.local/share/yay/linux: Auto-merging PKGBUILD
// after: reset the diff repo
$ rm -rf ~/.local/share/yay/linux && yay -S linux
Defensive patterns

Strategy: try-catch

Validate before calling

diffDir="$HOME/.local/share/yay/$pkg"
if [ -d "$diffDir/.git" ] && ! git -C "$diffDir" diff --quiet; then
  echo "dirty diff repo for $pkg; resetting"; rm -rf "$diffDir"
fi
git --version >/dev/null || { echo 'git not installed'; exit 1; }

Type guard

func isGitMergeError(err error) (dir string, ok bool) {
	if err == nil { return "", false }
	msg := err.Error()
	if strings.HasPrefix(msg, "error merging ") {
		if i := strings.Index(msg, ": "); i >= 0 {
			return strings.TrimPrefix(msg[:i], "error merging "), true
		}
	}
	return "", false
}

Try / catch

if err := runYaySync(pkg); err != nil {
	if dir, ok := isGitMergeError(err); ok {
		os.RemoveAll(filepath.Join(diffRoot, dir)) // reset diff repo
		return runYaySync(pkg) // retry clean
	}
	return err
}

Prevention

When it happens

Trigger: Running yay sync/install where mergePkgbuilds calls gitMerge and the underlying `git merge --no-edit --ff` exits non-zero (e.g. merge conflicts in the diff repo, corrupt or dirty worktree, missing git binary).

Common situations: Users with local modifications to the yay diff repository hit fast-forward merge conflicts; corrupted ~/.local/share/yay diffs after interrupted syncs; git not installed or misconfigured (user.name/email policies blocking merge).

Understand the failure class

Background: "git command failed": what it means when a tool shells out to git and git exits non-zero — this error's family across 21 libraries.

Related errors


AI-assisted analysis of Jguer/yay@328f4b4939 (2026-09-07). Data as JSON: /api/errors/ee2c63680b228a96. Report an issue: GitHub.

Appendix: source

Thrown at pkg/sync/workdir/merge.go:24

	"github.com/leonelquinteros/gotext"

	"github.com/Jguer/yay/v13/pkg/settings/exe"
)

func gitMerge(ctx context.Context, cmdBuilder exe.ICmdBuilder, dir string) error {
	_, stderr, err := cmdBuilder.Capture(
		cmdBuilder.BuildGitCmd(ctx,
			dir, "reset", "--hard", "HEAD"))
	if err != nil {
		return errors.New(gotext.Get("error resetting %s: %s", dir, stderr))
	}

	_, stderr, err = cmdBuilder.Capture(
		cmdBuilder.BuildGitCmd(ctx,
			dir, "merge", "--no-edit", "--ff"))
	if err != nil {
		return errors.New(gotext.Get("error merging %s: %s", dir, stderr))
	}

	return nil
}

func mergePkgbuilds(ctx context.Context, cmdBuilder exe.ICmdBuilder, pkgbuildDirs map[string]string) error {
	for _, dir := range pkgbuildDirs {
		err := gitMerge(ctx, cmdBuilder, dir)
		if err != nil {
			return err
		}
	}

	return nil
}

View on GitHub (pinned to 328f4b4939)