From a848f827cf8a94182497d8d456d7619c91da8488 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 1/3] 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 295f71ec..fd96abaf 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 00000000..e529608d --- /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 From 8fb2d41c90c5d77623f4e04a89ed7272ee1bd8da Mon Sep 17 00:00:00 2001 From: Rudxain <76864299+Rudxain@users.noreply.github.com> Date: Sun, 17 May 2026 12:34:10 -0400 Subject: [PATCH 2/3] fix(resolve): rm `git continue` --- bin/git-resolve | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/git-resolve b/bin/git-resolve index e529608d..c1135e4e 100755 --- a/bin/git-resolve +++ b/bin/git-resolve @@ -27,5 +27,3 @@ git diff --name-only --diff-filter=U -z | git add -- "$f" fi done - -git continue From 3537c25fceeb22c73fb34abe5cf15944da69abc3 Mon Sep 17 00:00:00 2001 From: Rudxain <76864299+Rudxain@users.noreply.github.com> Date: Sun, 17 May 2026 12:36:56 -0400 Subject: [PATCH 3/3] fix(resolve): ignore space errs --- bin/git-resolve | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/git-resolve b/bin/git-resolve index c1135e4e..a3d15b37 100755 --- a/bin/git-resolve +++ b/bin/git-resolve @@ -9,7 +9,7 @@ git diff --name-only --diff-filter=U --relative -z | # `--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 + if ! git -c core.whitespace='' diff --check -- "$f" &>/dev/null; then printf '%s\0' "$f" fi done | @@ -23,7 +23,7 @@ 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 + if git -c core.whitespace='' diff --check -- "$f"; then git add -- "$f" fi done