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