pandazx's blog

Hadoop, データ分析など雑多な技術ブログ

GitHubにpushしたcommit記録の削除方法

開発当初は無我夢中でGitHubにpushしてきて、
ある時、振り返るときに消したい過去がある場合って、ありますよね。

私はあります(むしろ、今)

そこでGitHubの過去のcommit記録(Commit History)を消す方法を調べました。

色々と調べたのですが、ローカルでのcommitの編集方法が多くヒットし、
なかなか目的の方法が見つからなかったのですが、
ようやく以下のブログで見つかりました。
ずくなし。 : gitでpushしたcommitを取り消す - livedoor Blog(ブログ)

きっと、もっとスマートな方法があるのだと思いますが、
現状、以下の方法でやるのがいっぱいいっぱい。

やる時は自己責任で。
自分しか使わないプロジェクト以外ではオススメしない!

実行内容

ある時点までさかのぼって、それまでのcommitを消す。
プログラム内容は現時点の状態にする。

手順

現在のローカルの状態をコピーしてバックアップする
以下の手順でコミットを消すと、そこで追加したファイルは削除されるので
後で手で戻す必要があります。

GitHub上とローカルが同じ状態であることが前提
GitHubのCommit Historyページから何個前まで遡るか確認(以下は4個前までとする)

git rebase -i HEAD~4

以下のようにコミット単位にpick行が表示される

pick c047b57 コミットメッセージ1
pick 7ad53bb コミットメッセージ2
pick 4904961 コミットメッセージ3
pick 0f4a444 コミットメッセージ4

ここで一番下のpickの行以外を削除して保存して閉じる
(全部削除してしまうとキャンセルとみなされてしまう)

以下のようなメッセージが表示される

error: could not apply 7537b39... rebuild commit log

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply 7537b39... rebuild commit log

消した行のコミットがなくなるので、現在の状態との整合性を保つ必要がある

git rebase --continue

以下のようなメッセージが表示される

マージ対象ファイル名: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add

表示されたファイルを開いて、最新の状態が保つように編集する。
次にそれらのファイルをaddする

git add -A
git rebase --continue

いつものコミットメッセージの編集画面になるので
コミットメッセージを記述して保存

更新のあったファイル数と共に以下のようなメッセージが表示される

Successfully rebased and updated refs/heads/master.

以下のコマンドで確かにコミットが削除されていることを確認できる

git log

問題なければ、GitHubに結果をpushする

git push origin +master

GitHubのCommit Historyページを見るとコミットが消えていることが確認できる!

最初にバックアップしたフォルダから
本手順実施前の状態になるよう消えたファイルなどを手動で戻してコミットし直す。

これからはこんな面倒なことが必要ないよう、
見られたくない情報はコミットしないよう気をつけよう!