概要
-
git pull
しようとしたら、まだ一部作業中だったため、Changes not staged for commit:
と出てきてしまい、pull
ができない...そんな時、出てきた変更を上書きせずに残したまま、pull
する方法を紹介します。
前提: git stash
は一時退避時に使う
-
"Changes not staged for commit"
は、現在の作業ディレクトリ内にあるファイルの変更が、Gitのステージングエリアに追加されていないことを示しています。 - この状態はコミットすることで解決できますが、上書きせずに変更を残しておきたい場合もあると思います。その時に使うのが
git stash
です。 -
git stash
コマンドは、作業中の変更を一時的に保存し、後で復元することができるGitの機能です。
どんな時に使うの?
- 例えば、「ブランチAで作業中だったけど、ブランチBに移動(or
git pull
等)しなければならなくなった。でも、まだ作業途中だしコミットしたくないんだよなぁ...どうしよう」ってときに、一時退避みたいなイメージで使います。今回はgit pull
するときに一時退避する、というシーンを想定して記載しています。 - 参考:git stashの使い方!作業をコミットせず一時保存する方法!
他に想定される使用シーン
- ブランチを切り替える前に、作業中の変更を一時的に保存する場合
- 修正が必要なバグが発生した場合に、現在の作業を中断して修正を行い、修正後に作業を再開する場合
- マージやリベースなどの操作中に、作業中の変更を一時的に保存する場合
- 他の人が開発しているブランチに切り替える前に、作業中の変更を一時的に保存する場合
実行手順
- 以下コマンドで変更を一時的にstashして保存します。
$ git stash push "任意のメッセージ"
-
ちなみに以前までは
git stash save
コマンドが使われていたましたが、引数なしで実行した場合と-u
オプションを付けた場合の挙動が異なるため、混乱を招く可能性があるとのことで、非推奨になったらしい。 -
無事に
stash
を作れたら、以下でプルします。
$ git pull
-
"Changes not staged for commit"
は出てこないはずです。無事にプルできましたね。 - 変更を復元します。次のうちどちらかのコマンドを使用して、保存された変更を復元できます。
- ①
git stash pop
- ②
git stash apply
- ①
①git stash pop
$ git stash pop
- 上記の場合、stashされた変更を復元し、stashエントリを削除します。
②git stash apply
$ git stash apply
- 上記の場合、stashされた変更を復元するだけで、stashエントリは削除されません。
stashエントリを指定したい場合は?
- 指定して復元したい場合は、念の為、その前にstashの中身をまず確認しましょう。
- 以下でstashエントリのリストを確認できます。
$ git stash list
- 以下のようにエントリを指定します。
$ git stash show stash@{1}
- すると、中身が表示されます。間違いない場合は、このエントリのみを指定して復元します。
n
の部分は、復元したいstashエントリの番号に置き換えます。
$ git stash apply stash@{n}
- この場合も、上述の通り、
git stash pop stash@{n}
でもOKですが、エントリを残しておきたいのかどうかで判断しましょう。
stashエントリを削除したい場合は?
- 以下のコマンドを実行すると、
stash@{1}
エントリが削除されます。
$ git stash drop stash@{1}
- リモートブランチの変更を取得し、現在のブランチにマージします。
$ git pull
Username for 'https://github.com': github-xxx
Password for 'https://github-xxx@github.com':
error: unable to unlink old 'xxxxxxx/settings.py': Permission denied
fatal: cannot create directory at 'xxxxx/xxxxxxxx': Permission denied
パーミッションエラーの時は...
-
pull
時に、上記のようなエラーがでてくることがあります。 - これは、ファイルのパーミッションに関するエラーメッセージ。この問題を解決するには、sudoを使用して、管理者権限でgit pullを実行します。管理者権限でコマンドを実行することで、ファイルのパーミッションを変更することができます。
$ sudo git pull
- 管理者パスワードを求められる場合がありますので、パスワードを入力してください。このコマンドを実行することで、git pullが正常に実行され、ファイルのパーミッションが適切に変更されることが期待できます。
備考
-
pull
した後に変更が競合する可能性があるため、pull
する前に変更をステージングすることが望ましい場合があります。 -
git stash
コマンドは一時的に変更を保存するための機能であるため、複数人での作業を行う場合や、長期間の作業を行う場合には、定期的に変更をコミットして、変更の履歴を残すことが望ましいです。あくまでそういった前提で進めている時の一時退避という使い方が適切でしょう。