Gitバージョンの戻し方 - 3つのコマンドと使い分け
Gitのバージョンの戻し方は主に3つの方法があります。
git checkout
git revert
git reset
本記事では、それぞれの方法と使用シーンについて説明します。
1. git checkout
git checkout
は、指定したコミットへの一時的な移動を行います。ただし、この方法では新しいブランチを作成せず、現在のブランチが直接移動します。これにより、戻し前の状態に戻すことが難しくなる場合があります。
使用例
git checkout [コミットハッシュ]
2. git revert
git revert
は、指定したコミットの変更を逆に適用した新しいコミットを作成します。そのため、履歴が保持され、他の人との共同作業に影響を与えにくい方法です。
使用例
git revert [コミットハッシュ]
3. git reset
git reset
は、指定したコミットまでの履歴を削除する方法です。注意が必要な操作ですが、コミット履歴を綺麗に保ちたい場合に使用します。git reset
には3つのオプションがあります。
-
--soft
: コミット履歴を戻し、戻した分の変更をステージングエリアに保持します。 -
--mixed
: コミット履歴を戻し、戻した分の変更をワーキングディレクトリに保持します(デフォルト)。 -
--hard
: コミット履歴とともに、戻した分の変更も削除します。
使用例
git reset --soft [コミットハッシュ]
git reset --mixed [コミットハッシュ]
git reset --hard [コミットハッシュ]
どの方法を選ぶべきか?
方法 | 履歴の保持 | 変更の破棄 | 使用シーン |
---|---|---|---|
checkout | 保持 | 一時的 | 履歴の確認 |
revert | 保持 | 新コミット | 変更を戻す |
reset | 削除 | 選択可能 | 綺麗な履歴 |
それぞれの方法にはメリットとデメリットがあります。現在の状況と目的に合わせて適切な方法を選んでください。ただし、git reset
は他の人との共同作業に影響を与えることがあるため、慎重に使用してください。
利用シーン毎の使い分け
履歴を確認したいだけの場合
一時的にコミットを確認したいだけで、そのコミットで作業を続けたいわけではない場合は、git checkout
を使用することがおすすめです。確認が終わったら、元のブランチに戻ることができます。
間違ったコミットを取り消したい場合
過去の特定のコミットを取り消したい場合は、git revert
がおすすめです。これにより、取り消しを行った新しいコミットが作成されるため、他の開発者との共同作業に影響を与えにくくなります。
現在のブランチのコミット履歴を綺麗に保ちたい場合
コミット履歴を綺麗に保ちたい場合や、一連のコミットをまとめて取り消したい場合は、git reset
を使用します。ただし、git reset
は他の開発者との共同作業に影響を与えることがあるため、注意して使用してください。
以下に、各操作の流れを示すイラストを用意しました。
- A - B - C (master) # 初期状態
git checkout
- A - B - C (master)
^
HEAD
git revert
- A - B - C - D (master)
^ ^
Revert HEAD
git reset
- A - B (master)
^
HEAD
それぞれの方法によって、Gitのバージョンを戻すことができます。現在の状況と目的に応じて、最適な方法を選んでください。
GitHubへの反映方法
バージョンを戻した後にリモートリポジトリに反映させる方法について説明します。方法は、使用したローカルでのバージョン戻し操作によって異なります。
git checkoutの場合
git checkout
で一時的にバージョンを戻した場合、通常はそのままリモートリポジトリに反映することはありません。ただし、戻したバージョンで新しいブランチを作成し、そのブランチをリモートにプッシュすることができます。
- 新しいブランチを作成して切り替える:
git checkout -b new_branch_name [コミットハッシュ]
- 新しいブランチをリモートリポジトリにプッシュする:
git push origin new_branch_name
git revertの場合
git revert
でバージョンを戻した場合、新しいコミットが作成されているので、通常通りgit push
でリモートリポジトリに反映させることができます。
git push origin [ブランチ名]
git resetの場合
git reset
でバージョンを戻した場合、リモートリポジトリとローカルリポジトリの履歴が一致しなくなるため、通常のgit push
ではリモートリポジトリに反映できません。そのため、--force
オプションを使って強制的にプッシュする必要があります。
git push origin [ブランチ名] --force
ただし、--force
オプションを使用すると、他の開発者の作業に影響を与えることがあるため、注意して使用してください。特にチームでの共同作業の場合は、他の開発者に事前に連絡をし、影響範囲や対応策を確認してから実行してください。
Discussion