ある任意のブランチで作業を進めている際に、「コミット」せずにいきなりgit checkoutでブランチを切り替えようとするとエラーが表示されてしまいます。このような時に利用するのが「git stash」です。
git stashコマンドで、コミットせずに作業を一時的にstashという領域に保存することが可能となります。作業の途中でブランチを切り替えたい時などに利用します。
まずは状況が分かりやすいようにSourcetreeからで説明します。
Sourcetree(Mac版)による方法
下記画面の様子は、mytestブランチ上で、任意のファイルを編集しコミットしていない状態(Uncommitted changesが表示されている)です。
「スタッシュ」ボタンをクリックすると、下記のようなウィンドウが表示されるので適当なメッセージを入力して「OK」をクリックします。
履歴で「Uncommitted changes」が消えて、一時退避の項目に「On mytest:bを追加」が表示されます。これでコミットされていない状態が、一時的にstash領域に保存されます。
戻す場合は「On mytest:bを追加」をダブルクリックして表示されるウィンドウにて「OK」します。「適用した変更を削除」にチェックを入れると、一時退避の項目から「On mytest:bを追加」も削除されます。
Gitコマンドによる方法
上述した手順をGitコマンドでおこないます。
1 2 3 4 |
git branch master * mytest |
masterブランチに切り替えようとすると、エラーが表示される状態です。
1 2 3 4 5 6 |
git checkout master error: Your local changes to the following files would be overwritten by checkout: sample.txt Please commit your changes or stash them before you switch branches. Aborting |
git stashコマンドでコミットしていない状態をstash領域に一時的に保存します。saveオプションでメッセージを残しています。これでブランチを切り替えてもエラーは表示されなくなります。
1 2 3 |
git stash save 'bを追加' Saved working directory and index state On mytest: bを追加 |
git stash listコマンドでスタッシュした変更の一覧を表示できます。
1 2 3 |
git stash list stash@{0}: On mytest: bを追加 |
戻す場合は以下のようにします。applyで戻した場合、listには任意の変更(下記例ではstash@{0}:〜)が残ったままです。
1 |
git stash apply stash@{0} |
1 2 3 |
git stash list stash@{0}: On mytest: bを追加 |
dropで変更の一覧から、任意の変更を削除することができます。
1 |
git stash drop stash@{0} |
戻すと同時に、任意の変更を削除する場合は、popを適用します。
1 |
git stash pop stash@{0} |