Git でファイルに変更を加えたあとでブランチを切り替える


はじめに

Git Flow などのブランチ構成を採用しているとブランチを切り替え忘れたまま作業をしてしまうことがあります。(ありますよね?)
その場合に "ファイルの変更を維持したまま" ブランチを切り替える方法を残しておきます。

環境

git
$ git branch
* develop
  master
  working_branch

作業は working_branch で行うこととします。

やらかした状況

git
$ git status
On branch develop
Changes not staged for commit:
        modified:   sample.txt

develop ブランチで作業していますね、何を考えているのでしょうか。

正しいブランチに修正

行った変更を破棄して (Discard all changes) ブランチを変更しても良いのですが、一度書いたコードを捨てるのはもったいないので変更を維持したまま対応します。

git stash を使用して変更を退避させます。

git
$ git stash
Saved working directory and index state WIP on develop: [コミット情報]

これで変更を退避させました。
状態を確認してみましょう。

git
$ git status
On branch develop
nothing to commit, working tree clean

develop ブランチへの変更がなくなりました。

退避したものはどこへ?
git
$ git stash list
stash@{0}: WIP on develop: [コミット情報]

これが退避した変更です。

では本来の作業ブランチである working_branch に切り替えて反映させます。
反映させるコマンドは git stash apply です。

git
$ git checkout working_branch
Switched to branch 'working_branch'
$ git stash apply
On branch working_branch
Changes not staged for commit:
        modified:   sample.txt

これで変更を反映させることができました。

複数 stash した際の stash apply について
git
$ git stash list
stash@{0}: WIP on working_branch: [コミット情報]
stash@{1}: WIP on working_branch: [コミット情報]
stash@{2}: WIP on working_branch: [コミット情報]

stash apply する際に対象を指定することができます。

例えば 0番目 を指定する場合には

git
$ git stash apply stash@{0}
On branch working_branch
Changes not staged for commit:
        modified:   sample.txt

このように stash@{x} を付与して指定します。