Error messages
When something fails, yaggui shows a message written for people, not the raw Git output, and offers the next step as a button when there is one. This page explains where errors appear, then lists every message by area so you can search for the text you see.
How errors are shown
Section titled “How errors are shown”- Toast: most errors appear as a toast in the bottom-right corner. Error toasts stay until you close them (the × button, or swipe right). Warnings, such as a merge stopped on conflicts, close on their own after a few seconds. A failed operation’s toast is titled after it, for example “Fetch failed” or “Push failed”, with the message below.
- Inline panel: when the error belongs to a dialog or a panel, it appears inside it, and the dialog stays open so you can fix the input. Examples: the Open a repository dialog, a repository tab that could not open (“Could not open the repository”, “Could not open {name}”), the commit box.
- Banner: some states are shown as a banner above the graph instead: a Git lock file, automatic refresh unavailable, an operation in progress (see Conflicts).
- Dialog: a few errors open a dedicated dialog, for example local changes in the way of a checkout, or an undo that would overwrite local changes.
Each error can have:
- Details: a collapsed section with the raw technical text, usually what Git printed on stderr. Expand it to see Git’s exact words; select the text to copy it.
- An action button: the fix yaggui can run for you. The labels are listed below.
An error that is not one of yaggui’s typed errors (a bug in the interface) shows a toast titled “Something went wrong”, with the technical text under Details. Please report it.
Action buttons
Section titled “Action buttons”| Button | What it does |
|---|---|
| Retry | Runs the failed action again. |
| Refresh | Reloads the data (file list, diff, branches) and runs the action again. |
| Open command log | Opens the command log, switches its filter to All if needed, and expands and highlights the last failed command with its full output. |
| Trust this folder… | Asks for confirmation, then runs git config --global --add safe.directory <path> and opens the repository again. See Repository won’t open. |
| Remove the lock… | Asks for confirmation, then deletes the stale index.lock. See Another Git process is using this repository. |
| How to install Git | Explains how to install Git 2.30 or later. |
| Set your identity | Opens the identity form in the commit box. |
| Choose a terminal… | Opens the terminal setting. |
| Pull then push | Pulls with your default strategy, then pushes again. |
| Set upstream and push | Pushes again and sets the upstream, after confirmation. |
A button only appears when it makes sense where the error happened: for example Retry needs an action to repeat.
Reading the catalog
Section titled “Reading the catalog”The tables below list each message as yaggui shows it in English. Parts in braces are filled in: {path} is a folder or file path, {name} a branch, tag or remote name, {short} a 7-character commit hash. The French interface shows the same messages in French. The last column gives the internal error code, which you can quote in a bug report.
yaggui recognizes Git’s own errors by their English text (it runs Git with LC_ALL=C), so the matching works whatever your system language. A Git failure that matches nothing in the catalog shows “The Git command failed.” with Git’s output under Details.
Repository and setup
Section titled “Repository and setup”| Message | When it happens | What to do | Code |
|---|---|---|---|
| Git was not found. Install Git 2.30 or later and restart yaggui. | yaggui could not start the git program: Git is not installed, or not on the PATH. The status bar shows “git not found”. |
Install Git, or set its path in Preferences → Git. Button: How to install Git. See Git not found. | gitNotFound |
| “{path}” is not a working Git: the file must exist and answer to –version. | You entered a Git binary path in Preferences → Git that does not exist, is not executable, or is not Git. | Check the path. Nothing was saved. | gitBinaryInvalid |
| The folder {path} does not exist. | You opened a path that does not exist, or a known repository was moved or deleted. | Check the path. For a known repository, use Locate… or Remove from recents in the tab. | repoNotFound |
| {path} is not a Git repository. | The folder is not inside a Git repository. | Open the repository folder, or initialize one. | notARepository |
| Git refuses to use {path} because it belongs to another user. Add it to safe.directory only if you trust it. | The folder belongs to another user account, and Git’s safe.directory protection refuses it. |
Button: Trust this folder…, only if you trust the folder (its hooks will run). | unsafeRepository |
| Another Git process is using this repository (index.lock). If no Git process is running, the lock is left over from a crash and can be removed. | .git/index.lock exists: another Git program is working, or one crashed. |
Wait for the other program. If none is running, button: Remove the lock…. yaggui only deletes a lock older than 10 seconds; a fresher one is refused with the same message. The banner above the graph offers the button only once the lock is that old. | indexLocked |
A path is too long for Windows. Enable long paths with git config --global core.longpaths true, then retry. |
Git for Windows hit the 260-character path limit (“Filename too long”). | Run the command in a terminal, then retry. Button: Open command log. | pathTooLong |
| The folder {path} already exists and is not empty. Choose another folder, or an empty one. | The clone or worktree target folder already holds files. | Pick another folder name or an empty folder. | targetNotEmpty |
| {path} already is a Git repository. | You tried to initialize a repository inside an existing one. | Open it instead. | alreadyRepository |
| The branch “{name}” does not exist on the remote. (or: The branch does not exist on the remote.) | The branch typed in the clone dialog does not exist on the remote. | Leave the branch empty to get the default branch, or fix its name. | remoteBranchNotFound |
| Bare repositories are not supported yet. | You opened a bare repository (one without a working tree). | Open a regular clone instead. | invalidArgument |
| Expected an absolute folder path, got “{path}”. | The path typed in a dialog is relative. | Enter the full path, or use Browse…. | invalidArgument |
Working tree and staging
Section titled “Working tree and staging”| Message | When it happens | What to do | Code |
|---|---|---|---|
| {path} changed since its diff was shown. Refresh and select again. | You staged, unstaged or discarded hunks or lines of a file that changed on disk after the diff was displayed. The staging view shows “The file changed” and refreshes the diff. | Select the lines again in the refreshed diff. Button: Refresh. | staleDiff |
| {path} changed on disk since it was opened. | You edited a file in the diff, and it changed on disk before you saved. The editor shows “{path} changed on disk while you were editing it.” | Use Reload from disk, then redo your edit. Nothing was overwritten. | fileChanged |
| “{path}” cannot be edited here: it is not UTF-8 text. (other endings: it was deleted, it is not a regular file, it is stored with Git LFS, it is too large, it is binary, it mixes LF and CRLF line endings) | You tried to edit a file in the diff that yaggui cannot edit safely. | Edit it in your editor. | invalidArgument |
| Lines cannot be staged or discarded while whitespace is ignored. | Line staging was attempted while the diff hides whitespace changes. | Turn off the whitespace option in the diff. | invalidArgument |
| Nothing to stash: you have no local changes. | You stashed with a clean working tree. | Nothing to do. | nothingToStash |
| The stash conflicts with your files. Resolve the conflicts; the stash is kept, drop it once you are done. | Applying or popping a stash produced conflicts. The The stash conflicts dialog lists the files. | Resolve the files, then drop the stash yourself. See Stash. | stashConflict |
| The checkout is done, but your stashed changes conflict with this branch. Resolve the conflicts; the stash is kept, drop it once you are done. | You chose Stash, check out, then pop and the pop conflicted. | Same as above. | stashConflict |
| Git LFS is not installed: large files stay as pointers. Install Git LFS (git-lfs.com), then run git lfs install. | The repository uses Git LFS and the git lfs command is missing. |
Install Git LFS, run git lfs install. See Git LFS. |
lfsNotInstalled |
Commit
Section titled “Commit”| Message | When it happens | What to do | Code |
|---|---|---|---|
| Nothing to commit: stage changes first. | You committed with nothing staged (and not amending). | Stage changes first. During a squash merge, the toast “The squash brings no change” means the branch is already merged: abort the merge. | nothingToCommit |
| Git does not know who you are: set your name and email (user.name, user.email) to commit. | user.name or user.email is not configured. In the commit box, the Who are you? form opens instead of a toast. |
Fill in the form and click Save and commit. Elsewhere, button: Set your identity. | identityUnknown |
| The {name} hook rejected the commit. Its output explains why. (or: A Git hook rejected the commit. Its output explains why.) | A pre-commit, prepare-commit-msg or commit-msg hook failed. The commit box shows the hook’s output. |
Fix what the hook reports and commit again. See Hooks fail. | hookFailed |
| The signing key needs its passphrase and no agent provided it. yaggui never asks for it: unlock the key in gpg-agent or ssh-agent (ssh-add), or commit from a terminal. | Commit signing is on (commit.gpgsign) and the key is locked. |
Unlock the key in your agent, then commit again. Button: Open command log. | signingFailed |
| Git could not sign the commit. Check the signing key (user.signingkey, gpg.format) or turn signing off (commit.gpgsign). | Signing failed for another reason (no key, wrong format, signing program missing). | Check the signing settings in Git configuration. Button: Open command log. | signingFailed |
| There is no commit to amend yet. | You checked Amend in a repository with no commit. | Make a normal first commit. | invalidArgument |
| The commit summary is empty. | You committed without a summary line. | Type a summary. | invalidArgument |
Branches and refs
Section titled “Branches and refs”| Message | When it happens | What to do | Code |
|---|---|---|---|
“{name}” is not a valid branch name: no spaces, no ~ ^ : ? * [ \, no “..”, and it cannot start with “-” or end with “/”, “.” or “.lock”. |
The name is refused by git check-ref-format. The same message says “tag name” for tags. Shown under the name field. |
Change the name. | invalidRefName |
| A branch named “{name}” already exists. (or: A tag named “{name}” already exists.) | The name is taken. Shown under the name field. | Choose another name. | refExists |
| You have local changes. Stash them, or bring them along to the other branch. | A checkout meets local changes. The Local changes in the way of {name} dialog opens. | Choose Stash, check out, then pop or Bring the changes along. See Branches. | dirtyWorktree |
| Your local changes would be overwritten by the checkout. Stash them first (stash, checkout, then pop). | Same, but the changes cannot be carried over. | Choose Stash, check out, then pop. | dirtyWorktree |
| The branch “{name}” is not fully merged: deleting it can lose commits. Force the deletion only if you no longer need them. | git branch -d would refuse the deletion. |
In the delete dialog, click Delete anyway (runs git branch -D) if you no longer need the commits. |
branchNotMerged |
| “{name}” is the current branch: check out another branch before deleting it. | You tried to delete the checked-out branch. | Check out another branch first. | currentBranch |
| “{name}” is a protected branch: the cleanup never deletes it. Delete it on its own if you really mean to. | A batch branch cleanup included a protected branch. | Delete it individually if you mean it. | protectedBranchDelete |
| “{name}” is checked out in a worktree: it cannot be deleted. | A batch deletion included a branch used by a worktree. | Remove or switch the worktree first. | branchCheckedOut |
| The branch “{name}” is checked out in the worktree {path}: open that worktree, or check out another branch here. (or: … is checked out in another worktree.) | Git refuses to check out the same branch in two worktrees. | Open that worktree, or pick another branch. | branchInOtherWorktree |
| The branches or stashes changed in the meantime. Refresh and try again. | The branch or stash list changed (for example from a terminal) after yaggui listed it. The list shows “The list changed”. | Check the refreshed list and try again. Button: Refresh. | staleRefs |
| HEAD is detached (no current branch): check out a branch first. | The operation needs a current branch (push, pull, interactive rebase). | Check out a branch. | detachedHead |
| No commit matches “{rev}”. | A commit hash, branch or revision you entered does not exist. | Check the spelling, or fetch first. | revisionNotFound |
| The worktree {path} has local changes: removing it would lose them. | git worktree remove refused because of local changes. The dialog shows This worktree has local changes. |
Commit them in the worktree, or use Remove anyway and lose these changes. | worktreeDirty |
| The worktree {path} is locked. Unlock it (git worktree unlock) before removing it. | The worktree is locked. | Run git worktree unlock <path> in a terminal. |
worktreeLocked |
History operations and conflicts
Section titled “History operations and conflicts”| Message | When it happens | What to do | Code |
|---|---|---|---|
| The merge stopped on conflicts. Resolve them, then continue to create the merge commit (or abort the merge). | A merge left conflicts. A warning toast shows “{count} files in conflict” with Show conflicts, and the operation banner appears above the graph. | Resolve the files, then Continue or Abort merge. See Conflicts. | conflicts |
| The rebase stopped on conflicts. Resolve them, then continue (or skip this commit, or abort the rebase). | A rebase left conflicts. | Resolve, then Continue, Skip or Abort rebase. | conflicts |
| The cherry-pick stopped on conflicts. Resolve them, then continue (or skip this commit, or abort). | A cherry-pick left conflicts. | Resolve, then continue, skip or abort. | conflicts |
| The revert stopped on conflicts. Resolve them, then continue (or abort). | A revert left conflicts. | Resolve, then continue or abort. | conflicts |
| The pull stopped on conflicts: the merge is in progress. Resolve them, then continue to create the merge commit (or abort the merge). | A pull with merge left conflicts. | Same as a merge. | conflicts |
| The pull stopped on conflicts: the rebase is in progress. Resolve them, then continue (or skip this commit, or abort the rebase). | A pull with rebase left conflicts. | Same as a rebase. | conflicts |
| Some files are still in conflict: resolve them (and stage them) first. | You continued or committed with unresolved files. | Resolve and stage every conflicted file. Button: Show conflicts. | unresolvedConflicts |
| Your local changes would be overwritten by the {merge, rebase, cherry-pick, revert or reset}. Commit or stash them first. | Local changes are in the way of the operation. The toast lists the first files. | Commit or stash them, then retry. Button: Show changes. | dirtyWorktree |
| Another operation (merge, rebase, cherry-pick, revert or bisect) is in progress: continue or abort it first. | You started an operation while another one is unfinished. | Continue, skip or abort it from the banner above the graph. | operationInProgress |
| No merge, rebase, cherry-pick or revert is in progress. | You clicked Continue, Skip or Abort but the operation already ended (for example in a terminal). | Nothing to do. | noOperation |
| {short} is a merge commit: choose which parent’s side to keep. | You cherry-picked or reverted a merge commit. | Choose the parent in the dialog that opens. See Cherry-pick, revert and reset. | mainlineRequired |
| {short} brings no change any more (it is probably already applied): skip it. (or: This commit brings no change any more…) | The commit being applied is already in the branch. | Button: Skip. | emptyCommit |
| The branches have diverged: “{name}” cannot be fast-forwarded. Merge with a merge commit, or rebase. | You asked for a fast-forward-only merge of diverged branches. | Button: Merge instead…, or rebase. | notFastForward |
| The commits to rebase include merges: yaggui does not rebuild them. Choose a base after the last merge. | An interactive rebase range contains merge commits. | Pick a more recent base. See Interactive rebase. | invalidArgument |
| More than 200 commits to rebase: choose a more recent base. | The interactive rebase range is too long. | Pick a more recent base. | invalidArgument |
| No external merge tool is configured: set merge.tool in your Git configuration. | You asked for the external merge tool with no merge.tool set. |
Set it in External tools. | mergeToolMissing |
| The merge tool “{tool}” could not be started. Check that it is installed and configured (mergetool.{tool}.cmd). | The configured merge tool did not start. | Install it, or fix its configuration. | mergeToolFailed |
| No external diff tool is configured: choose one in the preferences (Tools) or set diff.tool in your Git configuration. | You asked for the external diff tool with none configured. | Choose one in Preferences → Tools. | diffToolMissing |
| The diff tool “{tool}” could not be started. Check that it is installed and configured (difftool.{tool}.cmd). | The configured diff tool did not start. | Install it, or fix its configuration. Button: Open command log. | diffToolFailed |
Undo and redo
Section titled “Undo and redo”| Message | When it happens | What to do | Code |
|---|---|---|---|
| Nothing to undo in this session. | The undo history is empty. | Nothing to do. | nothingToUndo |
| Nothing to redo. | No undone operation, or a new operation ran since. | Nothing to do. | nothingToRedo |
| This operation changed a remote: it cannot be undone locally. | You tried to undo a push or another remote change. Toast title: “Cannot undo”. | Revert or force push by hand if you really need to. See Undo and redo. | undoBlocked |
| A fetch with prune cannot be undone: the deleted remote-tracking branches come back with the next fetch if they still exist. | You tried to undo a fetch with prune. | Nothing to do. | undoBlocked |
| A pull cannot be undone: what it fetched stays. Reset the branch instead if needed. | You tried to undo a pull. | Reset the branch. | undoBlocked |
| This operation downloaded and checked out content (LFS files, submodule commits): it cannot be undone. | You tried to undo an LFS pull or a submodule update. | Nothing to do. | undoBlocked |
| The worktree was removed with its local changes: they cannot be brought back. | You tried to undo a forced worktree removal. | Nothing to do. | undoBlocked |
| The state before this operation could not be recorded: it cannot be undone. | yaggui could not take its snapshot before the operation. | Nothing to do. | undoBlocked |
| The repository changed since this operation (branches or files modified elsewhere): undoing it would lose that change. | Something changed after the operation, outside yaggui’s history. The dialog Cannot undo: the repository changed since lists what moved. | Nothing was touched. Button: Refresh. | undoDiverged |
| Your local changes would be overwritten. Commit or stash them first. | Undo or redo would overwrite local changes. The Local changes are in the way dialog opens. | Click Stash and retry, then pop the stash afterwards. | undoWouldOverwrite |
Remotes and network
Section titled “Remotes and network”| Message | When it happens | What to do | Code |
|---|---|---|---|
| Push rejected: the remote branch has commits you don’t have. | The remote branch moved ahead of yours. | Button: Pull then push. See Fetch, pull and push. | pushRejected |
| Force push refused: the remote branch moved since your last fetch. Fetch and check what would be overwritten. | --force-with-lease refused because someone pushed meanwhile. |
Fetch, look at the new commits, then decide. | staleLease |
| “{name}” is a protected branch: force push is refused. | You force pushed a branch listed in Protected branches (Preferences → Behavior). | Push normally, or change the preference. | protectedBranch |
| SSH authentication failed. Load your key in ssh-agent (ssh-add) and check that the remote knows it. | The SSH server refused your key, the key is not loaded in the agent, or the host key is unknown. | Run ssh-add, or ssh -T git@<host> once in a terminal to accept the host key. No button. See Authentication. |
authFailed |
| Authentication failed. yaggui never asks for passwords: configure a Git credential helper (git config credential.helper) and sign in once from a terminal. | An HTTPS remote needs credentials that no helper provided, or refused them (401, 403). | Configure a credential helper and sign in once from a terminal. No button. See Authentication. | authFailed |
| Remote not found: check its name and URL. | The remote does not exist, or there is no repository at its URL (404). | Check the URL in Remotes. | remoteNotFound |
| The remote host can’t be reached. Check your connection and the remote URL. | DNS failure, refused or timed-out connection. | Check your network or VPN. Button: Retry. | hostUnreachable |
| “{name}” has no upstream branch. | You pulled or pushed a branch without upstream. On push, yaggui asks Publish the branch? instead. | Click Publish, or button: Set upstream and push. | noUpstream |
| Your branch and its upstream diverged: a fast-forward is impossible. Pull with merge or rebase. | A fast-forward-only pull met diverged branches. | Choose Merge or Rebase in the pull menu. No button. | notFastForward |
| The remote refused the tag {name}: a tag of that name already exists there and points to another commit. Delete the remote tag first, or rename yours. | Pushing a tag that exists on the remote with another target. | Delete the remote tag or rename yours. See Tags. Button: Open command log. | tagRejected |
| The remote refused the tags {names}: tags of those names already exist there and point to other commits. The other tags were pushed. | Same, for several tags. | Same. Button: Open command log. | tagRejected |
| The remote refused the tag {name} (server rule or hook). See the command log for its answer. | A server hook or rule declined the tag. | Read the server’s answer. Button: Open command log. | tagRejected |
| A remote named “{name}” already exists. | Adding or renaming a remote to a taken name. Shown under the name field. | Choose another name. | remoteExists |
“{name}” is not a valid remote name: no spaces, no leading dash, none of ~ ^ : ? * [ \. |
The remote name is refused by Git. Shown under the name field. | Change the name. | invalidRemoteName |
| The remote URL is empty. | You saved a remote without URL. | Enter a URL. | invalidArgument |
Tools and system
Section titled “Tools and system”| Message | When it happens | What to do | Code |
|---|---|---|---|
| The terminal “{name}” could not be started. Check its name in the terminal setting. | The configured external terminal did not start. | Button: Choose a terminal…. See Terminal. | terminalNotFound |
| No terminal was found on this system. Choose the one to use in the terminal setting. | No known terminal was found. | Button: Choose a terminal…. | terminalNotFound |
| The shell “{shell}” could not be started in the integrated terminal. | The integrated terminal could not start your shell. The panel shows “The terminal could not start”. | Check your shell. Details has the system error. | shellFailed |
| This terminal is closed: open a new one. | The integrated terminal session ended. | Open a new terminal. | terminalClosed |
| The editor “{name}” could not be started. Check its name in the preferences. | The configured editor did not start. | Fix it in External tools. | editorNotFound |
| No application could open the file. Choose an editor in the preferences. | No editor is configured and the system has no default for the file. | Choose an editor in Preferences → Tools. | editorNotFound |
| The file manager could not open the repository folder. | Opening the repository folder in the file manager failed. | Open the folder by hand. | fileManagerFailed |
| Automatic refresh is unavailable for this repository (the system limit on watched files may be reached). Changes made outside yaggui will show after a manual refresh. | yaggui could not watch the repository folder. Shown as the Automatic refresh unavailable banner. | Click Refresh after outside changes. On Linux, raise the inotify limit. | watchUnavailable |
| Could not check for updates. | The update check could not read the latest release (offline, GitHub unreachable). | Try again later. No button. See Updates. | updateCheckFailed |
| The update could not be installed. | Downloading, verifying or installing the update failed. Details says why. | Button: Retry, or download the release by hand. | updateInstallFailed |
| The avatar could not be downloaded. | A Gravatar picture could not be fetched. Not shown as a toast: the author’s initials stay. | Nothing to do. | avatarUnavailable |
yaggui internals
Section titled “yaggui internals”These messages point to a bug or a broken local setup rather than a Git problem. If one appears, report it with the content of Details.
| Message | When it happens | What to do | Code |
|---|---|---|---|
| The Git command failed. | Git failed with an error yaggui does not recognize. Details has Git’s output. | Read the output. Button: Open command log. | gitFailed |
| Unexpected error. | An internal failure (file system, repository read). Details has the cause. | Retry; report it if it persists. | internal |
| yaggui could not read or write its local data. | The settings database or keybindings.json could not be read or written. |
Check the data folder permissions and free space. | storage |
| Operation cancelled. | You cancelled an operation. Usually shown as “{op} cancelled”. | Nothing to do. | cancelled |
| Repository #{id} is not open. | The repository tab was closed while an action was running. | Open the repository again. | repoNotOpen |
| Operation #{id} is not running. | You cancelled an operation that had already finished. | Nothing to do. | opNotFound |
| Not implemented yet. | A command has no implementation in this build. | Report it. | notImplemented |
Other validation messages (code invalidArgument) appear under the field you filled, for example “The stash message is empty.” or “The depth must be between 1 and …”. They describe the fix themselves.