リモートブランチにコミットしたファイルをなかったことにする方法

例えば、公開したくないファイルをGitHubに上げてしまっている時に、ファイルを削除するコミットをプッシュしても

リモートブランチのコミット履歴には公開したくないファイルが残ってしまいます。

 

こうした時には、次のようにすれば全てのコミット履歴からファイルを削除できます。

 

対象のブランチに移動

git checkout {ブランチ名}

過去の各チェックアウトについて、公開したくないファイルが含まれていないコミットを作成

git filter-branch --tree-filter 'rm -f {ファイルのパス}' HEAD
git commit -m 'Delete File'

リモートブランチのコミット履歴を上書きする

git push origin {ブランチ名} --force

 

【備考】

–forceを付け忘れると、過去にファイルをコミットした時点からの履歴が二重に表示されるようになってしまうので注意が必要です。

 

また

git filter-branch --tree-filter 'rm -f {ファイルのパス}' HEAD

 を実行したときに次のようなエラーが出てしまう時には、

A previous backup already exists in refs/original/
Force overwriting the backup with -f
rm:cannnot remove 'c:/Git/Sources/Repos/HelloBase/.git-rewrite/backup-refs': Permission denied
rm: cannnot remove directory 'c:/Git/Sources/Repos/HelloBase/.git-rewrite':Directory not empty

 refs/original/の中のフォルダと.git-rewriteを削除すれば、実行できるようになります。

 

http://git-scm.com/のコードを参考にさせていただきました。

http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88