質問: ◾️事象 gitignoreに指定したファイルを'git rm --cached'コマンドで削除した際、ローカル環境からもファイルが消える。 ◾️詳細について もともとGitHub対象だったファイルを途中からgitignoreに追加して、管理対象外としました。 その際、リモートのリポジトリからもファイルを削除するため、下記のコマンドを実行しました。 git rm --cached ファイル名 その後、いつの間にか指定したファイルがローカル環境から消えており、 後日、ローカル環境、本番環境(AWS/EC2)共に起動しなくなり、事象が発覚した。 ◾️再現できる手順 環境:MacBook Air(iOS10.14)/Github/GitHubDesktop/ターミナル/Visual Studio Code/rails5.2.1 1GitHubDesktopでmasterから、新しくブランチをきる。 2GitHubDesktopを新しいブランチに切り替える。 3ローカル環境でVisualStudioCodeを使いgitignoreに対象のファイルパスを記述。 GitHubDesktopでコミット&プッシュする。 (ちなみに事象発生はconfig/secrets.yml) 4ローカルターミナルから「git rm --cashed ファイル名」を実行する。 5GitHubDesktopを開くと、rm対象のdeleteコミットが自動で出てくるので更にコミット&プッシュ。 6新しくきったブランチに対し、GitHubDesktopからプルリクしてmasterにマージをかける。 (この時点でGitHubのリモートリポジトリからgitignore対象のファイルが消える) 7GitHubDesktopでFetch originを実行する。 8GitHubDesktopでローカル環境に差異があるため、pull originを求められるため、実行する。 9ローカル環境からgitignoreで指定したファイルが消える。 ◾️疑問点 gitrm時、オプションとして--cachedを選んでいるためローカルからは消えないと思っていたのですが、何故この動きなのでしょうか?純粋にmaster上で対象ファイルがdeleteされたと言うcommitのみ解釈しているのでしょうか? ですが、そもそもgitignoreはマージした時点でmasterにも効いている訳ですから、削除ではなく無視するのが適切ではないかとも感じます。 なお、今回再現できる手順はこれですが、実際にはブランチを切らない状態でも消えてしまいました。。。 (再現手順不明・・・) 原理・原則が分かると気をつける事や、再現も可能かな?と思っています。 詳しい方、ご教示いただけると非常に嬉しいです。 拙い文章で非常に申し訳ありませんが、よろしくお願いいたします。
回答: > > もともとGitHub対象だったファイルを途中からgitignoreに追加して、管理対象外としました。 > > > 一度コミットされたファイルは、あとから`.gitignore`に追加してもGitに残り続け、`git rm`で削除すると**削除されたということがコミットで反映されます**。 リモートのファイルを残したい場合は、 * いったんファイルをバックアップして、`git rm`で削除を反映してから書き戻す(一度やれば`.gitignore`が効くようになります) * `assume-unchanged`や`skip-worktree`を使う(Qiita)