Resolve conflicts
When a merge, rebase, cherry-pick or revert stops, yaggui shows a banner above the graph and lists the conflicted files. This page covers the banner and its Continue, Skip and Abort buttons, the conflicts panel, the 3-way merge editor, the choice view for deleted or binary files, and external merge tools. For what a conflict is, see Basic merge conflicts.
The operation-in-progress banner
Section titled “The operation-in-progress banner”yaggui reads the operation state from the .git folder (MERGE_HEAD, rebase-merge/, CHERRY_PICK_HEAD, REVERT_HEAD, the sequencer, bisect and git am state). The banner therefore also appears for an operation you started in a terminal, and it is still there after you restart the app.
The banner shows:
- A title: for a rebase with a known step, Rebase {step}/{total} (for example “Rebase 3/7”) with a progress bar. Otherwise Merge in progress, Rebase in progress, Cherry-pick in progress, Revert in progress, Bisect in progress or Applying patches (git am).
- A summary: Rebasing {branch} onto {onto}, Merging {source} into {target}, Squash-merging {source} into {target}, Cherry-picking {commit} onto {target} or Reverting {commit} on {target}.
- The number of conflicts still unresolved, and Show conflicts, which selects the working copy so the conflicts panel appears.
- The Continue, Skip and abort buttons described below.
While an operation is in progress, the other history actions (merge, rebase, cherry-pick, revert, reset, interactive rebase) are disabled with Finish or abort the operation in progress first. The palette also has Continue the operation in progress, Skip the current commit of the operation and Abort the operation in progress.
Continue
Section titled “Continue”Continue is disabled until every conflict is resolved; its tooltip says Resolve the {count} remaining conflicts first. It is hidden during a bisect.
For a merge, cherry-pick or revert, a Continue dialog lets you edit the message of the commit about to be created (“Edit the message of the commit that is about to be created, if needed.”), prefilled with the message Git prepared. Click Continue or press ⌘Enter (Ctrl+Enter on Windows and Linux). If Git prepared no message, yaggui continues without the dialog. A rebase continues directly.
| Operation | What Continue runs |
|---|---|
| Merge | git commit -F - with the message |
| Cherry-pick, revert | git commit -F - for the stopped commit, then git cherry-pick --continue / git revert --continue if more commits remain |
| Rebase | git rebase --continue |
git am |
git am --continue |
Toasts: Merge completed, Rebase completed, Cherry-pick completed, Revert completed, Patch applied. If a rebase stops again on a commit marked Edit, you see Rebase paused at step {step}/{total} with “Amend the commit if needed, then continue.” If it stops on new conflicts, the conflicts toast comes back.
If the stopped cherry-pick or revert brings no change any more, Continue fails with “{short} brings no change any more (it is probably already applied): skip it.”
Skip drops the current commit and goes on with the next one: git rebase --skip, git cherry-pick --skip, git revert --skip, git am --skip or git bisect skip. There is no confirmation. It is not offered for a merge, which has no commit to skip. Toast: {operation}: commit skipped.
The abort button is named after the operation: Abort merge, Abort rebase, Abort cherry-pick, Abort revert, Stop bisect or Abort. It asks for confirmation:
| Operation | Confirmation | Command |
|---|---|---|
| Merge | Abort the merge? The branch goes back to how it was before the merge. Conflict resolutions already made are lost. | git merge --abort (git reset -q --merge for a squash merge) |
| Rebase | Abort the rebase? The branch goes back to how it was before the rebase started. The commits already replayed are discarded. | git rebase --abort |
| Cherry-pick | Abort the cherry-pick? The branch goes back to how it was before the cherry-pick. Conflict resolutions already made are lost. | git cherry-pick --abort |
| Revert | Abort the revert? The branch goes back to how it was before the revert. Conflict resolutions already made are lost. | git revert --abort |
| Bisect | Stop the bisect? HEAD goes back to where it was before the bisect started. | git bisect reset |
git am |
Abort the patch application? The branch goes back to how it was before. | git am --abort |
Toast: {operation}: cancelled, back to the previous state.
The conflicts panel
Section titled “The conflicts panel”When an operation is in progress and the working copy is selected, the Conflicts panel sits above the local changes in the right panel. Its counter reads {unresolved} unresolved of {total}, then All {total} resolved.
Each row shows the path, a Binary badge when relevant, and what happened:
| Text | Situation |
|---|---|
| Both sides changed the content | Both changed the same file |
| Both sides added this file | Both added a file at the same path |
| Deleted on {ours}, modified on {theirs} / Modified on {ours}, deleted on {theirs} | Delete/modify |
| Added on {ours} only / Added on {theirs} only | The file exists on one side only |
| Deleted on both sides | Both deleted or renamed it differently |
Files resolved during the operation stay in the list, marked Resolved.
Buttons on an unresolved file, all without confirmation:
- Resolve… opens the file in the merge editor or the choice view.
- Take {side} (two buttons) keeps the whole file as it is on that side:
git checkout --ours|--theirsthengit add, orgit rmwhen that side deleted the file. - Mark resolved stages the file as it is on disk (
git add, orgit rmif it no longer exists).
Which side is which
Section titled “Which side is which”Instead of “ours” and “theirs”, yaggui names each side after its branch (or the commit’s short SHA, or mine / theirs when there is nothing better) and gives its role:
| Operation | Left side (“ours”) | Right side (“theirs”) |
|---|---|---|
| Merge | The current branch (current branch) | The branch being merged (merged branch) |
| Rebase | The branch you rebase onto (rebasing onto) | Your branch’s commit being replayed (commit being replayed) |
| Cherry-pick | The current branch | The picked commit (cherry-picked commit) |
| Revert | The current branch | The reverted commit (reverted commit) |
During a rebase, Git replays your commits on top of the other branch, so “ours” is the other branch and “theirs” is your own work. That is the opposite of a merge. yaggui shows the branch names, so Take main always means the version from main. See git-rebase.
The 3-way merge editor
Section titled “The 3-way merge editor”Resolve… on a text file changed on both sides opens the editor in place of the graph. It shows the versions as they are when it opens; changes made on disk meanwhile are not reloaded.
- Top: the two sides, read only, titled with the side name, its role and
sha · summary. Changes that do not conflict are already merged. - Each conflict block has a header Conflict {n} / {total} in both side panels, with a checkbox (Keep conflict {n} from {name}):
- one side ticked: its lines go into the result;
- both ticked: both go in, in the order you ticked them (a badge shows which comes first);
- none ticked: the block stays unresolved and shows “Unresolved conflict: tick a side above, or type the result here”.
- Bottom: the Result, editable. Typing in a block resolves it with your text; ticking a box afterwards replaces your edit with that side. Take all from {name} takes every block from one side.
The toolbar shows the file position (File {index} / {total}), a counter ({count} conflicts left, then All blocks resolved), and navigation buttons.
| Key | Action |
|---|---|
| ⌥↓ (Alt+↓ on Windows and Linux) | Next conflict (wraps around) |
| ⌥↑ (Alt+↑ on Windows and Linux) | Previous conflict |
| ⌘S (Ctrl+S on Windows and Linux) | Save and mark resolved |
| Esc | Back to the graph (not while typing in the Result) |
Save and mark resolved stays disabled until every block is resolved (Resolve the {count} conflicts left first). It writes the file, keeping its line endings, and stages it. yaggui then opens the next unresolved file. After the last one: All conflicts are resolved, “Continue the operation in progress to finish it.”, and the graph comes back.
Leaving the editor with unsaved choices (Graph, Esc, or Resolve… on another file) asks Discard the resolution in progress?; the file stays in conflict.
External merge tool
Section titled “External merge tool”In the merge editor, Open in {tool} runs
git mergetool --no-prompt --tool=<tool> -- <path>and waits for the tool to close. The tool is the Merge tool preference if set (see External tools), else Git’s merge.tool setting. Without either, the button reads External tool and is disabled: “No merge tool configured: set merge.tool in your Git configuration (git config merge.tool <tool>).”
- If you saved the result in the tool: File resolved with {tool}, and the next file opens.
- If you closed it without saving: {tool} closed without resolving the file; the file stays in conflict.
- “The merge tool “{tool}” could not be started. Check that it is installed and configured (mergetool.{tool}.cmd).”
The external tool is offered only for text conflicts, not in the choice view.
Deleted, added and binary files
Section titled “Deleted, added and binary files”Files that cannot be merged line by line open in a choice view: one side deleted the file, only one side has it, both deleted it, or it is binary. A sentence explains the situation, for example “Binary file changed on both sides: it cannot be merged line by line. Choose the version to keep.”
Two cards show each side: what it did (Changed the file, Added the file, Deleted the file, Does not have this file), the size, the line count or Binary, and a preview (images are shown; text shows its first 40 lines). Click the button on the card you want: Take {name}’s version, Keep the changed version, Keep the file, Accept the deletion or Drop the file. There is no confirmation; accepting a deletion runs git rm.
Nothing on this page is recorded in the undo history: Continue, Skip, Abort, quick resolutions, saves from the merge editor and the external tool. Abort cancels the whole operation, including the resolutions already made. A merge, cherry-pick or revert finished with Continue cannot be undone with ⌘Z. See Undo and redo.