Git Revert
最終更新
git revert は、変更の逆を適用する新しいコミットを作成することでコミットを取り消します。履歴を書き換えるのではなく履歴を追加するため、revert はすでにプッシュ済みのコミットを取り消す安全な方法です。git reset とは異なり、他の全員に書き換えられたブランチの調整を強いることはありません。
これらをターミナルプレイグラウンドで試してみましょう。ブラウザ内の本物のシェルで、インストールは不要です。
構文
| Command | What it does |
|---|---|
git revert HEAD | 最新のコミットを取り消す |
git revert <hash> | ハッシュで特定のコミットを取り消す |
git revert HEAD~2..HEAD | コミットの範囲を取り消す |
git revert -n <hash> | 取り消すがまだコミットしない(ステージのみ) |
git revert -m 1 <merge-hash> | 親 1 を残してマージコミットを取り消す |
revert の実行中
revert が競合に遭遇したら、それを解決して続行します。
| Command | What it does |
|---|---|
git revert --continue | 競合を解決した後に再開する |
git revert --abort | 進行中の revert を中止する |
git revert --skip | 現在のコミットをスキップして続行する |
revert vs reset
| Behavior | git revert | git reset |
|---|---|---|
| 履歴を書き換える | いいえ | はい |
| プッシュ済みのコミットで安全 | はい | いいえ |
| 新しいコミットを作成する | はい | いいえ |
| 途中のコミットを取り消す | はい | 面倒 |
git revert のよくある質問
git revert と git reset の違いは何ですか?
git revert は、以前のコミットの変更を取り消す新しいコミットを追加し、履歴をそのまま残します。すでにプッシュしたコミットに対して安全です。git reset はブランチのポインタを後ろに移動して履歴を書き換えるもので、ローカルのコミットには問題ありませんが、共有ブランチでは危険です。公開されたコミットを取り消すには revert を、ローカルのものを取り消すには reset を使いましょう。すでにプッシュされたコミットを取り消すにはどうすればよいですか?
git revert <hash>(最新のものには git revert HEAD)を実行し、その新しい revert コミットをプッシュします。revert は履歴を書き換えないため、これが共有コミットを取り消す正しい方法です。force-push も不要で、すでにプルしたチームメイトへの支障もありません。マージコミットを取り消すにはどうすればよいですか?
マージコミットには 2 つの親があるため、Git はどの履歴の系統を残すべきかを知る必要があります。
git revert -m 1 <merge-hash> を使います。ここで -m 1 は、最初の親(通常はマージ先のブランチ)を残すように Git に指示します。マージを取り消すとマージされた変更は元に戻りますが、マージ自体は履歴に残ります。複数のコミットを一度に取り消せますか?
はい。直近の 2 つのコミットを取り消すには
git revert HEAD~2..HEAD のような範囲を渡すか、複数のハッシュを列挙します。Git はデフォルトで取り消したコミットごとに 1 つの revert コミットを作成します。-n を付けるとコミットせずにすべての取り消しをステージできるので、その後自分で 1 つのコミットを作成しましょう。これをオンラインで練習できますか?
はい。ターミナルプレイグラウンドを開いて、ブラウザ内の本物のシェルで
git revert を実行できます。インストールは不要です。Coddy の無料のインタラクティブな Git コースでも、変更の取り消しを段階的に扱っています。