gitの誤認例:.gitignore, --squash

gitのキャッシュ? ステージ? インデックス? - (新) 檜山正幸のキマイラ飼育記 メモ編 を書いたキッカケは:

「間違えてアップしたファイルを.gitignoreで削除する方法」という記述がある。どうも、.gitignore をファイル削除の手段だと思っているようだ。

間違えてアップしたファイルを.gitignoreで削除する方法

.gitignore というファイルを作成してそこにファイル名を書いて置けばいいんだけど、後からやる場合はキャッシュを削除する作業が必要みたい。

このことは、例えば次に書いてある。

  • .gitignoreファイルを更新 → プッシュ → 反映されない!

特にエラーなどはなく、.gitignoreに追加したファイルもプッシュされてしまう状況です。


調べたところ「Gitのキャッシュ」的なものが存在するらしく、それを消さないと設定を上書きできないようでした。

.gitignoreにファイルを指定することで、git上にアップしたくないファイルをアップせずに済みます。
ローカルでのみ必要なファイルがある場合に非常に便利です。

しかし、.gitignoreに記載したのに反映されなかったことがあったので、原因と解決策について記載します。


一度gitにアップしてもらったものを、.gitignoreに追加したことが原因だった。
キャッシュにインデックスが残っているので、.gitignoreの設定が反映されていなかった。

何を問題にしているかも分からなかったが、次のような発想らしい(想像):

  • .gitignoreに書いたファイルは“削除される”。
  • .gitignoreに書いたファイルが、リモートリポジトリにプッシュされる。
  • これはおかしい。

それに対する対処が:

  1. “キャッシュ”を全削除(いわゆる「キャッシュ」だという認識なのだろう)
  2. コミット
  3. プッシュ

なんでそうする? 実際は:

  1. .gitignmore を書き換えても、その時点では何も起きない。
  2. その後のワーキングツリーの構成規則が変わる。
  3. あくまで今後の変更だから、コミット済みのファイルツリーに影響はない。それをプッシュすれば、過去の状態がプッシュされる。
  4. 管理対象であるファイルを管理対象から外すには git rm --cached file する。
  5. .gitignore の役割と、ファイルを管理対象から外すことは直接の関連性はない。


次は git merge --squash の説明だが、差分モデルで考えてるように思える。git、言霊おそるべし - (新) 檜山正幸のキマイラ飼育記 メモ編 に書いたこと。

すると、ブランチを分けた時点からfoo-devブランチの最新コミットまでの差分が一つにまとまり、fooブランチにマージされます。

git、メカニズムと運用方針の混同 - (新) 檜山正幸のキマイラ飼育記 メモ編 も、「親子」の言霊の影響だろう。


今まで、変な説明を見ても記録しなかったが、これからは記録に残そう。


追記: どこかで「~/.gitignore_global に書いているので‥」みたいな記述をみて、「それなに?」と思ったけど:

実際は:

  1. 自分で ~/.gitignore_global を作る。
  2. git config --global core.excludesfile $HOME/.gitignore_global とする。
  3. ~/.gitconfig に追加される。
[core]
    excludesfile = /home/{ユーザー名}/.gitignore_global

インターネット情報はこういうことがあるからなぁ。