git commit --fixup
が何かについてはgit commit --fixup とは何か - 詩と創作・思索のひろばを読んでもらうとして、 fixup を適用したいコミットをいちいち git log
で調べるのが面倒なのでインタラクティブに選べるようにした。
以下のスクリプトをパスの通ったディレクトリに置くと git fixup
が使えるようになる。適当な変更を git add
して git fixup
を実行すると、その変更を fixup として適用したいコミットを peco や fzf で選べる。
git-fixup
#!/bin/bash
FILTER=${FILTER:-peco}
MAX_LOG_COUNT=${MAX_LOG_COUNT:-30}
if git diff --cached --quiet; then
commits="No staged changes. Use git add -p to add them."
ret=1
else
commits=$(git log --oneline -n "$MAX_LOG_COUNT")
ret=$?
fi
if [[ "$ret" != 0 ]]; then
headline=$(head -n1 <<< "$commits")
if [[ "$headline" = "No staged changes. Use git add -p to add them." ]]; then
echo "$headline" >&2
fi
exit "$ret"
fi
line=$("$FILTER" <<< "$commits")
[[ "$?" = 0 && "$line" != "" ]] || exit "$?"
git commit --fixup "$(awk '{print $1}' <<< "$line")" "$@"