ステージしたファイルと、していないファイルの両方を、そのままに残しておきたい。
そしてできれば、まだ commit していない段階の元のブランチに戻ってきたい。
普通は、こういう用途のために stash があるはず。
自分の知るかぎりだと stash の対象は「ステージしたファイルのみ」または「ステージされてないファイルもあわせた両方」のどちらか。
そうではなくて、その時点のステージされたファイルとステージされてないファイルを別物として保存したいと思った。
そして、今のワーキングディレクトリには何の影響も及ぼさずにブランチを切りたい。
つまり、
- 今のブランチから staged の状態のファイルを commit した場合のブランチを生やす
- さらにそのブランチから unstaged だったファイルも commit した場合のブランチを生やす。
- そのワーキングディレクトリの状態をとどめたまま、元の branch に戻ってくる。ステージ・非ステージの状態は最初の状態に戻す。
という感じ
checkout ではなく symbolic-ref を使ってブランチを移動するとできそうだとを買ったので、書いてみた。
autosave
#!/usr/bin/env bash
set -eu
current_branch=$(git rev-parse --abbrev-ref HEAD)
date=$(date +%Y%m%d-%H%M%S)
wip1="wip/$date/staged"
wip2="wip/$date/unstaged"
message_wip1="Autosave Staged files $date"
message_wip2="Autosave Unstaged files $date"
{
set +e
git checkout -q -B "$wip1"
git commit -q -m "$message_wip1" > /dev/null 2>&1
git checkout -q -B "$wip2"
git add .
git commit -q -m "$message_wip2" > /dev/null 2>&1
}
git symbolic-ref HEAD "refs/heads/$wip1"
git reset -q
git symbolic-ref HEAD "refs/heads/$current_branch"