LoginSignup
1
2

More than 5 years have passed since last update.

今のワーキングディレクトリに影響を及ぼさずに staged と unstaged の内容を commit した branch をそれぞれ作る。

Posted at

ステージしたファイルと、していないファイルの両方を、そのままに残しておきたい。
そしてできれば、まだ commit していない段階の元のブランチに戻ってきたい。

普通は、こういう用途のために stash があるはず。
自分の知るかぎりだと stash の対象は「ステージしたファイルのみ」または「ステージされてないファイルもあわせた両方」のどちらか。
そうではなくて、その時点のステージされたファイルとステージされてないファイルを別物として保存したいと思った。
そして、今のワーキングディレクトリには何の影響も及ぼさずにブランチを切りたい。

つまり、

  1. 今のブランチから staged の状態のファイルを commit した場合のブランチを生やす
  2. さらにそのブランチから unstaged だったファイルも commit した場合のブランチを生やす。
  3. そのワーキングディレクトリの状態をとどめたまま、元の 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"
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2