Git revertコマンドでコミットを取り消す方法:ステップバイステップ完全ガイド
git revertコマンドは、コミットを取り消してリポジトリを前のコミットの状態に戻すためのコマンドです。コミットを削除するのではなく、公開済みのコミットの変更を打ち消す新しいコミットを作成します。これにより、元のコミットはプロジェクト履歴の一部として保持されます。
Gitリポジトリで作業していると、まだ保存する準備ができていないコードを誤ってコミットしてしまうことがあります。
そんなときに役立つのがgit revertコマンドです。このコマンドを使えば、コミットをundo(取り消し)して、リポジトリを前のコミットの状態に戻すことができます。
本記事では、具体例を交えながらコードのリバート方法と、git revertコマンドの使い方について解説します。読み終える頃には、プロの開発者のようにgit revertでコミットを取り消せるようになっているでしょう。
コードをリバートする場面
Gitリポジトリで作業中に、コミットにミスがあることに気づくことがあります。
例えば、新機能の開発を終えたばかりのところに、修正が必要なバグが見つかったとしましょう。バグ修正をコミットした際、開発中の新機能の作業ディレクトリも一緒にコミットしてしまったことに気づきます。
つまり、そのコミットにはバグ修正と新機能の両方が含まれることになり、プロジェクトの他の共同作業者にとって混乱を招く可能性があります。本来なら、これら2つの変更は別々のコミットとして分けておきたかったところです。
こうした状況では、リポジトリをコミット前の状態に戻したいと思うかもしれません。最後のコミットをリバートすることで、コミットをやり直すチャンスが得られます。
git revertコマンドとは
git revertコマンドを使うと、コミットを取り消すことができます。ただし、プロジェクトからコミットを削除するのではなく、直近2つのコミット間の差分を見つけ、それらの変更を打ち消す新しいコミットを作成します。
git revertコマンドが便利なのは、リポジトリのプロジェクト履歴を保持できる点です。コミットを完全に削除するのではなく、リポジトリを別のコミットの状態に戻すため、プッシュしたすべてのコミットの正確な記録を残せます。
git revertコマンドは、直近のコミットを取り消したい場合に使用します。手動で変更を加え直す代わりに、コミットをリバートして、新しいコミットをコードベースにプッシュすればよいのです。
git revertコマンドの基本構文は以下の通りです:
git revert
それでは、このコマンドの動作を実際の例で確認してみましょう。
git revertの実行例
ローカルマシンには、README.mdという1つのファイルだけを含むサンプルリポジトリがあります。ファイルに変更を加え、それをコミットとして記録したいと思います。以下のコマンドを実行します:
git commit -m "docs: Update README.md with author info"
このコマンドを実行すると、「docs: Update README.md with author info」というメッセージ付きのコミットが作成されます。さらにREADME.mdファイルに別の変更を加え、次のコマンドでコミットします:
git commit -m "docs: Update order of authors by contributions"
このコマンドにより、リポジトリにもう1つコミットが作成されました。git log --pretty=onelineコマンド(コミットの一覧を簡潔に表示)を使うと、リポジトリの履歴に2つのコミットがあることがわかります:
6f52d877873e7d3b52c929647384dfdf2488da22 (HEAD -> master) docs: Update order of authors by contributions
57d763663e619088159bb7629243456f88feab79 docs: Update README.md with author info
ここで、最後のコミットを取り消したいと判断したとします。README.mdファイルに記載した著者の順序が誤っていたことに気づき、最後のコミットをプッシュする前の状態にリポジトリを戻す必要があります。
その場合、次のコマンドを使用します:
git revert HEAD
このコマンドを実行すると、デフォルトのテキストエディタが開き、コミットメッセージの入力を求められます。このコマンドにおけるHEADは最新のコミットを指します。ここでは「revert author order commit」というメッセージを入力します。すると、コマンドは以下の出力を返します:
[master b66c29a] revert author order commit "docs: Update order of authors by contributions"
1 file changed, 1 deletion(-)
この時点でgit log --pretty=onelineコマンドを実行すると、新しいコミットが作成されていることが確認できます:
b66c29a8c4c226fa9ae8cd8f9e086c0a73e6ecfe (HEAD -> master) revert author order commit "docs: Update order of authors by contributions"
6f52d877873e7d3b52c929647384dfdf2488da22 docs: Update order of authors by contributions
57d763663e619088159bb7629243456f88feab79 docs: Update README.md with author info
コミット履歴には3つのコミットが並んでいます。git revertコマンドは最後のコミットを削除するのではなく、前のコミットの変更を打ち消す新しいコミットを作成しました。つまり、リポジトリにプッシュしたすべてのコミットの完全な履歴がそのまま残っているのです。
git revertコマンドの実行にはコミット参照が必要です。今回の例ではHEADを指定することで、リポジトリを直近のコミットの状態に戻しました。
別のコミットに戻したい場合は、そのコミットのハッシュ値を指定します。コマンドでHEADと指定する代わりに、git logコマンドで表示されるハッシュを使えば、任意のコミットにリバートできます。特定のコミットにリポジトリを戻すコマンドの例は以下の通りです:
git revert 57d763663e619088159bb7629243456f88feab79
このコマンドは、SHAハッシュ57d763663e619088159bb7629243456f88feab79を持つコミットの状態にリポジトリを戻します。このリポジトリでは、そのハッシュは最初に行ったコミットに対応しています。
git revertとgit resetの違い
revertとresetはどちらも、Gitリポジトリ内の過去のコミットによる変更を取り消すために使われるコマンドですが、それぞれ動作が少し異なる点に注意が必要です。
git revertは、直前のコミットを取り消すために使用します。git revertを実行すると、2つのコミット間の差分が打ち消され、その後、変更が取り消された後のコードを含む新しいコミットが作成されます。
一方、git resetコマンドは、特定の範囲にあるすべてのコミットを削除することで、リポジトリを以前の状態に戻します。つまり、git resetを実行して過去のコミットを参照すると、リポジトリの現在の状態からそのコミットまでの間のすべてのコミットが削除されます。
一般的には、resetよりもrevertの方が推奨されます。主な理由は、git revertがプロジェクトの履歴を変更しないためです。これにより、開発者はプロジェクトに対して行われたすべての変更の正確な記録を維持できます。
さらに、git revertコマンドでは、リポジトリ履歴上の特定の時点にある個々のコミットに戻ることができます。一方、git resetコマンドは、現在いるコミットから遡ることしかできません。
つまり、リポジトリの履歴のずっと昔のコミットを取り消したい場合は、その時点より前のすべてのコミットを削除してから、変更をコミットし直す必要があります。これは、リポジトリ履歴の正確な記録を保持することを難しくします。Gitのようなバージョン管理ツールを効果的に活用する上で、履歴の正確な記録の保持は非常に重要な要素です。
まとめ
git revertコマンドを使うと、特定のコミット以降にコードリポジトリへ加えた変更を取り消すことができます。コミットを削除するのではなく、現在のコミットと過去のコミットとの間の差分を特定し、それらの変更を打ち消す新しいコミットを作成します。
本記事では、git revertコマンドを使ってGitのコミットをリバートする方法について解説しました。これであなたも、プロの開発者のようにgit revertコマンドを使いこなして、自信を持ってコミットを取り消せるようになったはずです!
-
jQueryのfind()メソッドとは?初心者向けステップバイステップ解説
jQueryのfind()メソッドという名前は聞き覚えがあるかもしれませんが、JavaScriptのfind()メソッドと混同しないよう注意が必要です。どちらも「見つける」ためのメソッドですが、返す結果はまったく異なります。 JavaScriptのfind()メソッドは、配列に対してのみ呼び出せるメソッドです。引数として渡され後から実行される「コールバック関数」を受け取り、そのコールバック関数で定義された条件を満たす最初の要素を見つけて返します。 一方、jQueryのfind()メソッドは大きく性質が異なります。すべてのjQueryメソッドと同様にセレクターに対して呼び出され、そのセレクタ
-
Git cherry-pickの使い方をステップバイステップで解説
開発を始めたばかりの頃、多くの人はgitのコマンドを繰り返し使う中で自然と覚えていきます。git pull、git push、git commitといった基本的なコマンドの意味はすぐに理解できるでしょう。しかし、規模の大きいプロジェクトに参加し、チームで開発するようになると、コードベースのバージョン管理履歴を整理された状態に保つために、より高度なgitコマンドを学ぶ必要が出てきます。 そのようなコマンドの一つが「git cherry-pick」です。このコマンドは、あるブランチから特定のコミットだけを取り出し、別のフィーチャーブランチやmasterブランチのHEADに適用したい場合に使用しま