ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

新規作成したファイルを選別してgit stashしたい

私が試した小技の話。
git stashの説明については以下を参照してください。
git stashすごく便利)

qiita.com

やりたいこと

タイトルの意味が伝わっているのか否か、微妙なところだと思う。
まずそもそもの話、git stashは新規作成した(untrackedな)ファイルはstashしない」
という特徴がある。(今まで追跡してなかったものは退避しないという考え方)

issueの区切りとか、開発の切れ目でstashしたい!!というときはちょっと不便。
で、やりたかったことは、追跡してなかったファイルの中でも.gitignoreファイルは残して、他のファイル(追跡したものも含めて)をstashしたかった。

新規作成したファイルも含めてstashする

これはオプションuをつければ解決できる。
ただこれだけでは、新規作成したファイルから、どれをstashしてどれをstashしないのか選ぶことはできない。

stashしたい変更を選択する

これは一般的にはgit addでも使うであろう、オプションpをつければ良い。
しかし、オプションupは同時に指定することができない。

オプションkを組み合わせる!!

オプションkというものがある。
公式の説明をgoogle翻訳に突っ込むと、

インデックスにすでに追加されているすべての変更はそのまま残ります。

とのこと。
ということで stashしたくない新規ファイルをaddしておいてオプションuとkを使ってstashする ことで、擬似的に私のやりたかったことを実現します。

コマンドで書くとこんな感じ↓

# gitignoreファイル(stashしたくない新規ファイル)をインデックスに追加しておく
git add gitignore

# オプションkとuを駆使
git stash save -k -u "メッセージの追加も可能"

注意事項

オプションkは、インデックスに残した変更を 残す だけで、 インデックスした変更をstashしないわけでなはない 模様(インデックスも実はstashされている)

stashを適用するときにstashしたときにaddしていたファイルをインデックスから戻しておくと、無駄にコンフリクトがおきたりする。

つまりは、上記の方法でstashした場合は、stashしたときの状態に戻してから適用する必要があるのでご注意を(もちろん、インデックスしていたファイルに何かしらの変更を加えていた場合は普通にコンフリクトするかと思う)

個人的には違和感のある仕様ではあるが、、
gitignoreファイルを避けるくらいだったら、上に挙げた方法で特段問題はなかった。