🌊

Gitバージョンの戻し方 - 3つのコマンドと使い分け

2023/04/15に公開

Gitのバージョンの戻し方は主に3つの方法があります。

  1. git checkout
  2. git revert
  3. 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で一時的にバージョンを戻した場合、通常はそのままリモートリポジトリに反映することはありません。ただし、戻したバージョンで新しいブランチを作成し、そのブランチをリモートにプッシュすることができます。

  1. 新しいブランチを作成して切り替える:
git checkout -b new_branch_name [コミットハッシュ]
  1. 新しいブランチをリモートリポジトリにプッシュする:
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