## はじめに
こんにちは、ぽっぽもちです。
今回は、意外とつまずきやすい Git の「reset」と「revert」について、効率的に学ぶための学習方法をまとめました。実際に手を動かしながら理解できる構成になっているので、Git の巻き戻し操作にあまり自信がない方はぜひ参考にしてみてください。
環境構築
本題に入る前に、まずは 何度間違えてもやり直せる練習用リポジトリ を作っておくことをおすすめします。安全な環境があると、resetもrevertも怖くなくなるので、操作の理解が一気に進みます。
今回の練習では、以下のような環境を準備しておくと便利です。
①: 2つのブランチを用意する。私は以下の様なブランチを準備しました。
・main ブランチ … 空の状態
・feature/git ブランチ … 練習用のコミットを追加するブランチ
この構成にしておくことで、feature/git で自由に操作しつつ、main は安全な状態に保つことができます。
②: feature/git に複数コミットを作るためのシェルスクリプトを用意する
毎回手でコミットを作るのは手間なので、一度実行するだけで6つのコミット(A〜F)が自動生成されるスクリプトを用意しておくと非常に便利です。
以下のスクリプトをコピーして使ってみてください。
#!/bin/bash
# 複数のコミットを作成するスクリプト
# 使用方法: ./create-commits.sh
echo "複数のコミットを作成します..."
# コミットA
echo "コミットA: 初期機能追加" >> practice.txt
git add practice.txt
git commit -m "A: 初期機能追加"
# コミットB
echo "コミットB: 機能改善" >> practice.txt
git add practice.txt
git commit -m "B: 機能改善"
# コミットC
echo "コミットC: バグ修正" >> practice.txt
git add practice.txt
git commit -m "C: バグ修正"
# コミットD
echo "コミットD: 新機能追加" >> practice.txt
git add practice.txt
git commit -m "D: 新機能追加"
# コミットE
echo "コミットE: パフォーマンス改善" >> practice.txt
git add practice.txt
git commit -m "E: パフォーマンス改善"
# コミットF
echo "コミットF: UI改善" >> practice.txt
git add practice.txt
git commit -m "F: UI改善"
echo ""
echo "コミット履歴を確認:"
git log --oneline
echo ""
echo "完了!AからFまでのコミットが作成されました。"
操作
① : mainブランチをプレーンな状態でPushする
② : feature/gitブランチにチェックアウトし、先ほど作成したシェルスクリプトを起動する。
コマンド : bash <自分で作成したファイル名>.sh
③ : コミットが正しく作成されたか確認する。
コマンド : git log
④ : push して PR を比較する。
環境構築で作成したものをpushし比較すると下記のようにPRを作成することができるかと思います。
main <- feature/git

git revert
準備が整ったので、まずは revert(取り消しコミットを作る方法) を試していきます。
使用するコマンドはこちら:
git revert <コミットハッシュ>

例えば、「E: パフォーマンス改善」以降をまとめて取り消したい場合は、
”git revert 0f3d529..HEAD”のように指定します。
このコマンドは「0f3d529 の次のコミットから HEAD まで」をrevertする、という意味になります。
実行して push すると、以下のように対象コミットが取り消された状態で PR に反映されます。

ファイルの中身を確認すると、対象の変更が正しく取り消されていることが確認できます。

git reset
次に、reset(履歴そのものを巻き戻す) を行います。
revert と違い、reset は コミット履歴ごと消える ため非常に危険です。
特にチーム開発では、勝手に reset を行うと他のメンバーに大きな影響を与えるため、基本的に使用しないようにしましょう。
🔒 まずはブランチのバックアップを推奨
reset を行う際は、ブランチのコピー(バックアップ)を作成しておくと安心です。
◻︎ブランチのコピーの仕方は以下の通りです。
1:コピーしたいブランチにチェックアウト
git checkout feature/git
2:その上でブランチを作成する
git branch feature/git-backup
3:削除したい元のブランチに戻る
リセットの基本コマンド
git reset --hard <コミットハッシュ>
今回は、"F : UI改善"までのリセット("F : UI改善"を含む)を行なっていきたいと思います。
コマンドは以下になります。
git reset --hard 851bdd0
これでリセット自体はうまくいっているはずです。logで確認してみてください。
reset を行うと履歴が強制的に書き換わるため、ローカルだけでは push できません。そのため、強制 push が必要になります。
強制pushのコマンド
git push --force origin feature/git
上記push 後にリモートを確認すると、revert していた「F: UI 改善」まで履歴ごと巻き戻っていることが確認できます。
まとめ
今回の内容を実践していただくことで、revert(安全に巻き戻す方法) と reset(履歴ごと戻す危険な方法) の違いがイメージしやすくなったのではないかと思います。
最近は視認性が非常に良いため、GUI ツールで Git 操作を行う現場も多く、コマンドを触る機会が減ってきています。これによってさらに黒い画面が恐怖だというエンジニアも増えてきているのではないかと思います。
ただしその一方、GUI は裏で複雑な処理を行うため動作が重くなることもあります。特にcheckout / branch 作成 / revert / reset のような基本操作はGUIよりコマンドで扱う方が確実で安全です。
コマンドを理解しておけば、トラブル時の復旧力も段違いに上がります。
ぜひ今回の内容を参考に、Git をより自在に使いこなしてみてください。
