Posted at

gitで未追跡(untracked)なファイルもまとめて退避(stash)する

More than 3 years have passed since last update.


stash便利ですよね

git stashを使えば作業中のファイルを一旦退避させておいて、別のブランチで作業し、その後また戻ってきて再開するってことができますね。

$ git branch

* original
hogehoge
master

# 作業中のファイルを一旦退避
$ git stash
# 退避できたか確認してみる
$ git stash list

# ブランチ変更
$ git checkout hogehoge
$ ~hogehogeブランチでなんか開発作業~

# ブランチを元に戻す
$ git checkout original

# 退避を元に戻す
$ git stash pop


でもstashってtrackedなファイルだけなんでしょ・・・・

git stashだと追跡してる(tracked)なファイルだけを退避してくれます。

なので追跡してない(addしてない)ファイルはそのまま残っちゃいます。

その状態でブランチ切り替えしたら追跡してないファイルがそのまま次のブランチでも残るので変更が混ざってしまいそうで嫌になります。


そんなときは-uオプションを使いましょう

#以下どちらでも可能

$ git stash -u
$ git stash --include-untracked

#忘れそうならメッセージも添えられます
$ git stash -u "あんな変更やこんな変更"

こうすれば追跡してないファイルも含めて退避できますし、後で元通りにも戻せます。

ちなみに、CentOS6.5だとgit1.7.1とかがはいってたりしますが、それだと古すぎて使えません。

できればgitは2.x系をソースからコンパイルするなどしてインストールしておきましょう。


いらなければdropしちゃいましょう。

別のブランチで作業するために退避させる時だけでなく、いらないものをまとめて消すことにも使えます。

F/Wの自動生成コマンドなどで自分が変更したもの以外のものまで生成されちゃって、なんかリポジトリに登録されているものと微妙に違いがあった場合、それをそのままコミット&プッシュしちゃうと誰かとコンフリクト起こしちゃう可能性があります。

まぁコンフリクト起こしてでもやる必要あったりしますが・・・・(汗

取り急ぎリリースしたい場合には自分の変更に関するものだけコミットしてあとの生成物は華麗にスルー・・・というか綺麗に消し去りたい場合は以下のようにできます。

$ git add <コミットしたいファイル>

$ git commit -m "このファイルは残す"
$ git stash -u "こいつらはいらないファイルたち"

# いらないファイルは全部消し去る
$ git stash drop

untrackedは残っているとresetできなかったりいろいろ面倒なので綺麗さっぱりしたいときにはこれが使えます。

そもそも自動生成物なら、間違って消してもまた生成しなおせばいいだけなので問題ありませんね。

自動生成以外のファイルはくれぐれも慎重にdropしましょう。

なお、追跡外のファイルだけを削除するなら以下もできます。

# 実際に消す前に消すファイルの一覧を確認

$ git clean -n

# 消す!(.gitignoreで指定したものは削除されない)
$ git clean -f

# .gitignore分も含めて消したいなら
$ git clean -xf


退避してそのまま作業すすめちゃったらstash内容を別ブランチに移しましょう

stashしたもののそのままそのブランチで作業したり、別のブランチからもどってきた後popするの忘れて作業続行したりすることもあります。

そんなときに思い出したかのようにpopしちゃうとコンフリクトする可能性があるので、stashしていた内容を一旦別ブランチに切り出しましょう。

# とりあえず変更をコミット

$ git commit -m "変更をコミット"

# 一旦別ブランチにstash内容を取り出す
$ git stash branch tmp-branch

# あとはマージするなりrebaseするなりお好きにどうぞ
$ git merge <元ブランチ>

これでもうstashは怖くありませんね