Как редактировать более ранний коммит
Как правило, я не хочу отменять кучу коммитов, а скорее отредактировать предыдущий коммит так, как мне хотелось бы, чтобы я его зафиксировал.
Я обнаружил, что исправляю прошлый коммит достаточно часто, поэтому написал для него скрипт.
Вот рабочий процесс:
git commit-edit <commit-hash>
В результате вы получите коммит, который вы хотите отредактировать.
Изменения коммита будут un поэтапными, готовыми к постановке так, как вам хотелось бы в первый раз.
Исправьте и поставьте коммит так, как вам хотелось бы.
(Вы можете использовать git stash save --keep-index
, чтобы спрятать любые файлы, которые вы не делаете)
Повторить коммит с --amend
, например:
git commit --amend
Завершить ребаз:
git rebase --continue
Назовите это следующее git-commit-edit
и вставьте его в $PATH
:
#!/bin/bash
# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461
set -euo pipefail
script_name=${0##*/}
warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }
[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"
# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")
# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
message=$(git print-commit-1 "$commit")
else
message=$(git log -1 --format='%h %s' "$commit")
fi
if [[ $OSTYPE =~ ^darwin ]]; then
sed_inplace=(sed -Ei "")
else
sed_inplace=(sed -Ei)
fi
export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)" # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty # Commit an empty commit so that that cache diffs are un-reversed
echo
echo "Editing commit: $message" >&2
echo