💭

もう怖くない??苦手意識からあまり使いたくなかったgit resetを理解する

2024/12/05に公開

タイトル通り、怖いんです。苦手なんです。リセットって言われると、後戻りできなそうじゃないですか。けど実務で使われてるのを見てこの認識ではいけないと思いました。

git reset とは

git resetは、リポジトリの状態を以前のコミットに戻すためのコマンドです。
使い方によって、コミット履歴・ステージングエリア・作業ツリー(ローカルの変更済みファイル)のいずれか、または複数をリセットできます。

主な用途と例

  1. 直近のコミットを修正したい場合
    コミットを取り消して修正を加え、再コミットする。
git reset --soft HEAD~1

履歴はそのまま、ファイルはステージング済み。
ステージングした変更を解除したい場合

  1. git add でステージングしたけど、やっぱり変更を取り消したい。
git reset HEAD ファイル名

ステージング解除、変更内容はそのまま作業ツリーに残る。
作業ツリーを含めて完全にリセットしたい場合

  1. 現状の変更を全て捨てて、過去の状態に戻したい。
git reset --hard コミットID

履歴、ステージング、作業ツリーをすべてリセット。

今回実際に使った場面

今回使われていた場面は、gitの練習でlib環境が更新されてないから、今のdevelopと同じ状況にしよう!と言われ、その時にgit resetが出てきました🤓チンプンカンプン

コマンド
git checkout lib
git reset --hard origin/develop

[コマンドの解説]

  1. git checkout lib
    lib ブランチに切り替えます。
    作業ツリーに未コミットの変更がある場合、ブランチの切り替えができないこともあるので注意。

  2. git reset --hard origin/develop
    現在チェックアウトしているブランチ(この場合は lib)を、リモートリポジトリのdevelopブランチと完全に同じ状態にします。
    --hard により、作業ツリー・ステージングエリア・ローカルコミットが全てorigin/developの状態にリセットされます。

実行後の状態
libブランチの内容がリモートのdevelopブランチと完全に一致します。
libに未コミットの変更やローカルの履歴がある場合、それらは完全に失われるので注意。


もう1つやったコマンドとその時に感じた疑問

git reset --hard lib:lib
リモートリポジトリ名 : リモートリポジトリ内のブランチ名

このコマンドで出来ることはリモートの最新のlibブランチの状態を持ってきてローカルのlibブランチをリモートと同じ様態にする!!
けどこれってfetchとかpullじゃだめなん????

A:同じようなことはできるが少しずつ違う

fetch の挙動

libブランチ移動後
git fetch lib
  1. リモートリポジトリ (lib) の情報を取得し、ローカルにリモート追跡ブランチ(例: lib/lib)として保存します。
  2. ただし、現在のローカルブランチには何も影響を与えません。
    ローカルブランチはそのままで、リモート追跡ブランチが更新されるだけです。

git pull の挙動

git pull lib lib
  1. fetch:
    リモート (lib) の lib ブランチの最新状態を取得します。

  2. merge:
    取得したリモートの変更をローカルブランチに マージ します。

つまり

ローカルの変更や履歴を完全に上書きしてリモートの状態に一致させたい場合は、git reset --hard lib:lib が最適です。

Discussion