想定環境
- Mac OS X 10.11
- RubyMine 8.0.3
プロジェクトディレクトリは次のパス。
/Users/kyoshida/RubymineProjects/eslplayer
課題
トピックブランチで作業している時に別のブランチで作業する必要があり、現在の変更内容をいったん保存したい、といったケース。
例えば feature/paginate
ブランチで作業していて、別の開発者から「自分の作業している feature/oauth
ブランチを見てほしい」と相談された場合を想定する。この場合、例えば次の3つの方法が考えられる。
- Subversion 方式
-
feature/paginate
ブランチでパッチを作成 -
feature/oauth
ブランチで作業を完了後 -
feature/paginate
ブランチに戻る - パッチをあてる
-
- rebase
-
feature/paginate
ブランチで一時的にコミット -
feature/oauth
ブランチで作業を完了後 -
feature/paginate
ブランチに戻る - 残りを実装後
- rebase
-
- バージョン管理機能を使わない
- 編集したファイルを適当な場所に退避する
- revert
-
feature/oauth
ブランチで作業を完了後 -
feature/paginate
ブランチに戻る - 退避したファイルを戻す
最後の方法はファイル数が少なければ出来ないこともないが、作業ミスの可能性が高くなる。Git にはこの方法に似た機能として stash があるので、これを利用する。
VCS -> Git -> Stash Changes... メニューを選択する。
ダイアログが表示されるので、Message 欄に適当なメモを入力(任意)して、Create Stash ボタンをクリックする。これで、内容が直前にコミットした状態に戻る。編集した内容は退避されている。
リモートリポジトリの最新の状態を取得するため、VCS -> Git -> Fetch メニューを選択する。
ブランチ切り替えで、新たな作業対象の feature/oauth
ブランチをクリックし、Checkout as new local branch でローカルにチェックアウトする。
feature/oauth
ブランチで作業を完了後、元の作業ブランチに戻る。
中断した作業内容が消えているので戻す。まずは VCS -> Git -> UnStash Changes... メニューを選択する。
次にダイアログで対象の stash(変更)を選択し、Pop stash にチェックを入れたあと、Pop Stash ボタンをクリックすると中断して退避した作業内容が復活する。
Pop stash は復活させたあと、その stash が削除される。残しておきたい場合はチェックしない。(@jnchito さん、情報ありがとうございます)
上記の図では Stashes 欄に複数の stash が表示されているが、これは過去に登録したもの。一番下が古く、一番上が新しい(スタック)。
UnStash Changes ダイアログの View では選択している stash の内容が確認できる。また、Drop では選択している stash を削除、Clear ではすべての stash を削除する事ができる。
Console
Version Controll ウインドウの Console タブの出力内容から実際に実行されている git コマンドは次の通り。ただし、各コマンド前にプロジェクトディレクトリに移動しているが、初回以降の表示は省略している。
# プロジェクトディレクトリに移動
cd /Users/kyoshida/RubymineProjects/eslplayer
# stash の登録
git -c core.quotepath=false stash save splitメソッドを実装中
# fetch
git -c core.quotepath=false fetch origin --progress --prune
# checkout
git -c core.quotepath=false checkout -b feature/oauth
# checkout
git -c core.quotepath=false checkout feature/paginate
# stash の復元
git -c core.quotepath=false stash apply stash@{0}