Git でリモートリポジトリをプッシュする前にコミットを元に戻す
このチュートリアルでは、プロジェクトディレクトリ内のファイルに加えられた変更を追跡するために使用するバージョン管理システムである Git のリモートリポジトリにプッシュされていないコミットをリセットする方法を説明します。
Git では、コミットはファイルに加えられた変更を追跡するために使用されます。場合によっては、ファイルの変更をローカルでコミットし、後でそれらの変更がもはや関連性がないと感じることがあります。
このコミットをリモートリポジトリにプッシュするのではなく、このコミットをリセットしたいと思います。git reset
コマンドを使用して、まだリモートにプッシュされていないコミットをリセットするこのタスクを実行できます。
Git のリモートリポジトリにプッシュする前にコミットを元に戻す
共同開発環境で Git を使用して、ファイルに加えられた変更を追跡します。Git は、コミットを使用してファイルへの変更を追跡するというこのタスクを実行します。
ファイルに加えられた変更に満足したら、プロジェクトの Git リポジトリに変更をコミットします。基本的な Git ワークフローでは、変更をテストして完了したら、ステージング領域に変更を追加します。そのために git add
コマンドを使用します。
ステージング領域に変更を追加した後、Git リポジトリに変更をコミットします。コマンド git commit
を使用して変更をコミットします。
各コミットは、リポジトリの状態と名前、タイムスタンプ、およびメッセージのスナップショットを記録するために使用されます。git commit
コマンドを使用して変更をコミットすると、それらの変更はローカルの Git リポジトリにコミットされます。
このローカルリポジトリは、リモート Git リポジトリに関連付けられています。次に、ローカル Git リポジトリのコミットをリモートリポジトリにプッシュします。これを実現するには、git push
コマンドを使用します。
コミットをリモートリポジトリにプッシュする前に、ローカルリポジトリの現在のコミットが不要になったと感じ、それを破棄したい場合があります。
したがって、ローカルリポジトリからコミットを破棄するには、git reset
コマンドを使用できます。Git リポジトリに次のようなコミット履歴があるとします。
$ git log --oneline
453dcfc (HEAD -> master) minor change
bea3aac (origin/master, origin/HEAD) some change
b14f387 Other change
...
コミット履歴では、コミット 453dcfc
はローカル Git リポジトリにありますが、リモートリポジトリにはまだありません。以前のコミットもリモートリポジトリにあります。
したがって、ローカルリポジトリに存在し、まだリモートリポジトリにプッシュされていないコミットを破棄するには、次のように git reset
コマンドを実行できます。
$ git reset --soft HEAD~1
上記の git reset
コマンドは、現在の HEAD
を 1 回のコミットでリセットします。--soft
オプションを指定した git reset
コマンドは、ステージング領域と作業ツリーには影響しません。
次のように、git status
が示すように、変更されたすべてのファイルがコミットされる変更
として保持されます。
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
これで、コミット履歴を再確認し、コミット 453dcfc
が存在しなくなったことを確認できます。
$ git log --oneline
bea3aac (origin/master, origin/HEAD) some change
b14f387 Other change
...
Git のリモートリポジトリにプッシュされていないコミットをリセットする方法を示しました。
詳細については、これらのリンクをご覧ください。