別ブランチをちょっといじってから元のブランチに戻りたい時はありませんか?
いつも git checkout
で元のブランチ名を入力したりコピーしたりしていましたが、
もっと簡単に元のブランチに戻れるためのbash関数を作ってみました。
よかったら試してください。
コマンドの説明
pushg
- 現在checkoutされているブランチかrevisionを記憶させる
- .gitstack というファイルの最後に追加される
popg
- 前回のpushgのブランチを再度checkoutさせる
- .gitstack から消される
※ .gitstack は各gitルートフォルダにて作成されます。
使い方の例
別ブランチに一時移動
$ git checkout my-feature
$ pushg # 今いるブランチを記憶させる
Added my-feature to .gitstack
$ git checkout other-branch
$ popg # さっきまでいたmy-featureに戻る
git checkout my-feature
前のrevisionに一時移動
$ git checkout my-feature
$ pushg # 今いるブランチを記憶させる
Added my-feature to .gitstack
$ git checkout HEAD~1 # 一つ前に移動
$ pushg # 今いるブランチを記憶させる
Added a1a1a1a to .gitstack
$ git checkout HEAD~1 # 更に前に移動
$ popg
git checkout a1a1a1a
$ popg
git checkout my-feature
- checkoutが失敗しても(変更ファイルがある等) .gitstack から消されますが、
popg 時にgit checkout
コマンドが出力されるので状況を確認してからそのコマンドを実行してください。
セットアップ方法
.bashrc
などの起動時に実行されるファイルにこちらの関数を追加します。
(次回接続時に関数が)
function pushg() {
local GITSTACK="`git rev-parse --show-toplevel`/.gitstack"
local BRANCH=`git symbolic-ref --short -q HEAD`
if [ -z "$BRANCH" ]; then
BRANCH=`git log -1 --oneline | cut -f1 -d' '`
fi
echo $BRANCH >> $GITSTACK
echo "Added $BRANCH to .gitstack"
}
function popg() {
local GITSTACK="`git rev-parse --show-toplevel`/.gitstack"
touch $GITSTACK
local BRANCH=`tail -n1 $GITSTACK`
if [ -n "$BRANCH" ]; then
sed -i '$d' $GITSTACK
echo "git checkout $BRANCH"
git checkout $BRANCH
else
echo 'Nothing in .gitstack'
fi
}
※ すぐ適応したい場合は、直接bashにコピペすることもできます。
その他
git status
などした時に .gitstack
ファイルを無視させる方法
mkdir -p ~/.config/git
echo .gitstack >> ~/.config/git/ignore
stackの中身を確認する(gitのルートフォルダにて)
cat .gitstack
stackを空にする(gitのルートフォルダにて)
rm .gitstack
ご意見
(あるいはもっと便利な方法など)
ありましたらコメントください!