ウェブサイト検索

GitHubからコミットを削除する方法


もしあなたが誤って何かをコミットしてしまい、それをGithubにプッシュしてしまった場合でも、それを削除したり修正したりする方法はまだあります。通常、Gitの履歴をいじることは望ましくありませんが、適切に行えば場合によっては安全なこともあります。

できるだけこれをしないでください

Gitの履歴からコミットを削除することは一般的に悪いアイデアです。Gitはファイルのすべてのバージョンを追跡するために作られており、歴史を保持するための削除の代替手段、例えばgit revertがあります。

一度リモートリポジトリ、例えばGithubにアップロードされると、そのコミットを完全に取り除くことははるかに難しくなります。これは、リポジトリを使用している他の誰もがそのリポジトリのローカルコピーを持っていて、強制的にコミットを削除すると、彼らのコピーが非同期になってしまうからです。

とはいえ、これを行う理由はいくつか残っています。たとえば、間違ってプライベートなデータをパブリックリポジトリにコミットしてしまった場合、何をしても履歴には依然として表示されます。これは同僚にいくつかの問題を引き起こす可能性がありますが、それでもこの場合、強制プッシュすることで可能です。

ローカルでのコミット修正

ローカルで作業している場合、まだ変更をGitHubにプッシュしていないなら、リモートにないコミットを安全にリセットまたは変更できます。Gitはローカルディレクトリを追跡し、内部で変更をステージし、Git履歴を保持します。これはすべてリモートと同期されますが、実行しているときだけです。

push/pull

GitHubはあなたのリポジトリの状態を、プッシュするまでは気にしません。

もしファイルをコミットする際に間違いを犯しただけであれば、ソフトリセットを行って新しいコミットを作成することができます。これは実際に一般的で、複数のコミットを一つにまとめたい場合、いわゆる「スクワッシュ」と呼ばれる方法が非常に便利です。変更を完全に破棄したい場合も、それが可能です(

--hard

リセット).

まだGithubにプッシュしていない場合は、ソフトリセットを使用して最近のコミットを取り消すことができます。これにより、ローカルファイルには影響がなく、最初からGitに変更をコミットしていなかったことになります。

git reset --soft HEAD~

もしあなたがただ新しいファイルを追加するか、最も最近のコミットを変更したいだけなら、Gitにはそれを正確に行うためのフラグが組み込まれています:

git commit --amend --no-edit

戻す (Github安全)

もしすでにGithubにプッシュされたコミットから変更を取り消したい場合、安全な方法はリバートを使用することです。リバートは「逆のコミット」を生成し、特定のコミットからのすべての変更を基本的に元に戻します。もし行を追加した場合、その行は削除され、ファイルを削除した場合、そのファイルは元に戻されます。

これは安全です。なぜなら、歴史を変更するのではなく、その上に新しい歴史を追加するからです。元に戻すコミットをGitHubにプッシュし、同僚にgit pullを実行させて更新を取得させることができます。

まず、git logを実行してコミットのリストを取得します:

次に、SHA1ハッシュをコピーしてコミットを元に戻します:

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

強制リセット(安全でない)

もし本当にコミットを削除したいのであれば、その方法はローカルで削除し、それからGithubに強制プッシュすることです。これは非常に危険であり、同僚のローカルリポジトリが混乱する可能性があるため、もしそれでも実行したいのであれば、Githubのリポジトリ設定で強制プッシュのブランチ保護を無効にする必要があるかもしれません。

次に、最新のコミットであれば、ローカルでコミットを削除できます。この方法が最も簡単です。

git reset --soft HEAD~

インタラクティブリベースも行うことができ、これはコミットが最新のものでない場合に便利です。例えば、コミットが12コミット前であった場合、その時点からリベースを行い、不適切なコミットを削除して保存することができます。

git rebase -i HEAD~12

ローカルリポジトリが正常に動作している状態になったら、GitHubに強制プッシュできます。

git push origin master --force

リポジトリが最新であることを確認してください! リモートブランチにあなたが持っていない変更がある場合、このプッシュによってそれらは上書きされます。

チームメンバーと調整した方が良いかもしれません。彼らにフィッチとリセットを実行するように連絡する必要があるかもしれません。

git fetch

git reset origin/master --soft

コミットを別のブランチに移動する

もし間違ったブランチにコミットしてしまい、コミットを削除して正しいブランチに移動したい場合は、そのためのツールがGitにあります。コミットを移動するためのガイドを読んで、詳しく学ぶことができますが、同じ原則が適用されます---もしコミットを完全に削除する必要がある場合は、強制リセットをしなければなりません。元に戻すことで問題ない場合は、単にリバートしてチェリーピックすることができます。

関連記事: