Add integrated Git conflict resolution workflow

Introduce a three-pane UIMergeView with an editable shared result
document, conflict navigation and acceptance actions, live diff
highlighting, synchronized scrolling, and contextual pane labels.

Read conflict stages directly from Git's index, detect paused merge
operations, restore conflict sessions, and support resolving, staging,
recreating, continuing, committing, and aborting operations.

Add repository-aware conflict state handling, safe asynchronous
lifetimes, merge operation UI, configurable key modifiers, i18n
strings, and focused merge-view and Git conflict tests.
This commit is contained in:
Martín Lucas Golini
2026-08-27 22:18:58 -03:00
parent 7d322a035f
commit 66d22ea5bb
29 changed files with 2604 additions and 107 deletions

View File

@@ -391,7 +391,47 @@ Name your stash (optional):</string>
<string name="git_stash_save">Save Stash</string>
<string name="git_stashes">Stashes</string>
<string name="git_tags">Tags</string>
<string name="git_unmerged">Unmerged</string>
<string name="git_conflicts">Conflicts</string>
<string name="git_conflict_missing_result">This conflict requires choosing whether to keep or delete the file.</string>
<string name="git_save_and_stage">Save &amp; Stage</string>
<string name="git_previous_conflict_file">Previous File</string>
<string name="git_next_conflict_file">Next File</string>
<string name="git_continue_operation">Continue</string>
<string name="git_commit_merge">Commit</string>
<string name="git_abort_operation">Abort</string>
<string name="git_no_continuable_operation">No continuable Git operation is active.</string>
<string name="git_no_abortable_operation">No abortable Git operation is active.</string>
<string name="git_conflict_state_failed">Unable to read Git's conflict state.</string>
<string name="git_merge_tab">Merge: %s</string>
<string name="git_merge_base">Base</string>
<string name="git_merge_result">Result</string>
<string name="git_merge_current_branch">Current branch (ours)</string>
<string name="git_merge_incoming_branch">Incoming branch (theirs)</string>
<string name="git_merge_upstream">Upstream</string>
<string name="git_merge_replayed_commit">Replayed commit (your change)</string>
<string name="git_merge_ours_stage">Ours (stage 2)</string>
<string name="git_merge_theirs_stage">Theirs (stage 3)</string>
<string name="git_merge_not_present">Not present</string>
<string name="git_conflict_save_failed">Unable to save the conflict result.</string>
<string name="git_conflict_markers_remain">The saved result still contains recognizable conflict markers.</string>
<string name="git_conflict_still_unmerged">Git still reports this path as unmerged.</string>
<string name="git_conflict_recreate_failed">Unable to restore the conflict in Git's index.</string>
<string name="git_conflict_recreate_save_failed">The conflict was restored in Git's index, but its marker text could not be saved to disk.</string>
<string name="git_resolve_before_continue">Resolve and stage all conflicts before continuing.</string>
<string name="git_confirm_abort_operation">Abort the current Git operation?</string>
<string name="git_resolve_conflict">Resolve Conflict</string>
<string name="git_accept_ours">Accept Ours</string>
<string name="git_accept_theirs">Accept Theirs</string>
<string name="git_conflict_no_longer_unmerged">Git no longer reports this path as unmerged.</string>
<string name="git_operation_merge">Merging</string>
<string name="git_operation_rebase">Rebasing</string>
<string name="git_operation_cherry_pick">Cherry-picking</string>
<string name="git_operation_revert">Reverting</string>
<string name="git_operation_stash_apply">Applying stash</string>
<string name="git_operation_ready">%s · Ready to continue</string>
<string name="git_operation_ready_commit">%s · Ready to commit</string>
<string name="git_operation_conflicts">%s · %d conflicts</string>
<string name="git_operation_conflict">%s · %d conflict</string>
<string name="git_unstage">Unstage</string>
<string name="git_unstage_all">Unstage All</string>
<string name="git_untracked">Untracked</string>