Git と Visual Studio 2017 その 8 : 一時的に作業を保存する
前回の記事ではチェリーピックで、他ブランチのコミットを一部適用する方法を説明しました。今回はブランチの切り替え時に作業中のファイル類を一時保存する方法を見ていきます。
Git におけるブランチ変更時の挙動
まずブランチ切り替え時に Git がどのように動くかを確認しましょう。
1. ‘git log --oneline --graph --all’ 実行で現状確認。前回記事のチェリーピックが終わった状態。
2. シンプルにするため、チェリーピックの前にリセット。
3. 次に作業を行う。Class1.cs ファイルに変更を加えてステージに追加。
4. さらに Class1.cs file に変更を加えて保存。
5. ‘git status’ を実行して、Class1.cs がステージングエリアと作業ディレクトリに存在することを確認。これは git add は実行したタイミングのファイルを保持するため、その後に変更したものは追跡していない。
6. ‘git checkout master’ で master ブランチに移動。Class1.cs に変更がある事が表示される。
7. ‘git status’ を再度実行。ブランチは master だがステージングエリアも作業ディレクトリも残っていることを確認。
作業中ファイルの保存 : Git
ブランチを間違えて作業している場合は上記動作が好ましいのですが、緊急で別のブランチに移動しないといけない場合には、移動先のブランチには作業中の変更を持ち越したくありません。その場合 git stash コマンドで作業中のアイテムを一時保存できます。
1. ‘git checkout dev’ でブランチ切り替え後に、‘git stash’ を実行。stash で現在追跡されているアイテムを保存可能。未追跡アイテムも保存したい場合は ‘git stash --include-untracked’ を実行。逆に作業ディレクトリは保存したいがステージングエリアはそのまま切り替え後のブランチに持っていきたい場合 ‘git stash --keep-index’ を実行。名前を付けていないため、コミット 5df97d2 に対して作業中 (WIP = Work in progress) と表示。
2.‘git status’ で現在の状況を確認。ファイルの変更がない状態。
3. ‘git stash list’ を実行すると保存した stash を確認可能。
4. 保存した変更を再度適用するには ‘git stash apply’ を実行。’git status’ を実行するとステージングエリアの状態が失われている。
5. ステージングエリアの状態も復元したい場合には、‘git stash apply --index’ を実行。stash apply の前に戻すために、’git reset --hard HEAD’ を実行してから試行。HEAD は最新のコミットのため、現時点では 5df97d2 と同じ。ステージングエリアも復旧。
6. ‘git stash list’ を再実行するとまだ前回の情報が残っている。’git stash drop’ で削除。’git stash pop’ を使うと apply と drop が同時に実行される。慣れないうちは apply を使えば stash 情報を即座に失わないため安心。
stash を使うことで、複数の状態を保存することもできます。詳細はこちら。
作業中ファイルの保存 : VS
Visual Studio 2017 は現時点では stash をサポートしていないようです。残念。
Stash からブランチの作成
作業を一時的に保存できるのは便利ですが、適用するタイミングを逃してコードを変更してしまう場合があります。この場合保存した内容を直接現在のコードに適用せず、ブランチとして復旧することが出来ます。
1. ‘git stash’ を再度実行して現在の作業を保存。その後 ‘git stash branch temp’ を実行。このコマンドはブランチを作成して保存内容を適用後、stash を削除する。
2. ‘git branch’ を実行して作成されたブランチを確認。
3. 後は必要に応じてマージなり、リベースなり実行します。
4. ‘git checkout master’ と ‘git branch -D temp’ を実行して作成した一時ブランチを削除。-D オプションが必要な理由は、temp ブランチの内容をどこにもマージしていないため。
まとめ
Visual Studio 2017 ではまだサポートされていない機能ですが、緊急にブランチ移動する場合とても便利な機能です。個人的にはコミットして後から整理していますが、それはまた別の機会に。次回はいよいよリモートを見ていきます。次の記事へ
中村 憲一郎