From 2f8c5f690890e30c5cba4c71d6cbb7d19f0ff9a2 Mon Sep 17 00:00:00 2001 From: Rudxain <76864299+Rudxain@users.noreply.github.com> Date: Wed, 4 Mar 2026 00:48:05 -0400 Subject: [PATCH] feat: add `resolve` cmd --- Commands.md | 11 +++++++++++ bin/git-resolve | 31 +++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100755 bin/git-resolve diff --git a/Commands.md b/Commands.md index 295f71ecb..fd96abaf7 100644 --- a/Commands.md +++ b/Commands.md @@ -58,6 +58,7 @@ - [`git rename-remote`](#git-rename-remote) - [`git repl`](#git-repl) - [`git reset-file`](#git-reset-file) + - [`git resolve`](#git-resolve) - [`git root`](#git-root) - [`git rscp`](#git-scp) - [`git scp`](#git-scp) @@ -1402,6 +1403,16 @@ or reset one file to certain commit $ git reset-file .htaccess dc82b19 ``` +## git resolve + +On default text-editor, open unmerged ("both modified" `status`) files in working-directory that have errors (e.g. conflict-markers), +then auto-stage all (in full work-tree) unmerged files without errors, +and finally [`continue`](#git-continue) (if possible). + +```bash +$ git resolve +``` + ## git mr Checks out a merge request from GitLab. Usage: `git mr [REMOTE]`. diff --git a/bin/git-resolve b/bin/git-resolve new file mode 100755 index 000000000..e529608d6 --- /dev/null +++ b/bin/git-resolve @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -eufo pipefail +IFS=$' \t' + +#shellcheck disable=SC2046 +# ignore files outside WD, to avoid overload +git diff --name-only --diff-filter=U --relative -z | + while IFS= read -r -d '' f; do + # `--quiet` implies `--exit-code` which is incompatible with `--check`; + # however, it could be special-cased internally, so it could work + # (untested) + if ! git diff --check -- "$f" &>/dev/null; then + printf '%s\0' "$f" + fi + done | + # WARN: `-r` is too new + # https://github.com/tj/git-extras/pull/1233#issuecomment-3957233996 + xargs -0r $(git var GIT_EDITOR) + +# user might have removed other conflict-markers, +# so check full WT +git diff --name-only --diff-filter=U -z | + while IFS= read -r -d '' f; do + # WARN: `f` is relative to repo root! + # this might be broken + if git diff --check -- "$f"; then + git add -- "$f" + fi + done + +git continue