もう怖くない??苦手意識からあまり使いたくなかったgit resetを理解する
タイトル通り、怖いんです。苦手なんです。リセットって言われると、後戻りできなそうじゃないですか。けど実務で使われてるのを見てこの認識ではいけないと思いました。
git reset とは
git reset
は、リポジトリの状態を以前のコミットに戻すためのコマンドです。
使い方によって、コミット履歴・ステージングエリア・作業ツリー(ローカルの変更済みファイル)のいずれか、または複数をリセットできます。
主な用途と例
- 直近のコミットを修正したい場合
コミットを取り消して修正を加え、再コミットする。
git reset --soft HEAD~1
履歴はそのまま、ファイルはステージング済み。
ステージングした変更を解除したい場合
- git add でステージングしたけど、やっぱり変更を取り消したい。
git reset HEAD ファイル名
ステージング解除、変更内容はそのまま作業ツリーに残る。
作業ツリーを含めて完全にリセットしたい場合
- 現状の変更を全て捨てて、過去の状態に戻したい。
git reset --hard コミットID
履歴、ステージング、作業ツリーをすべてリセット。
今回実際に使った場面
今回使われていた場面は、gitの練習でlib環境が更新されてないから、今のdevelopと同じ状況にしよう!と言われ、その時にgit reset
が出てきました🤓チンプンカンプン
git checkout lib
git reset --hard origin/develop
[コマンドの解説]
-
git checkout lib
lib ブランチに切り替えます。
作業ツリーに未コミットの変更がある場合、ブランチの切り替えができないこともあるので注意。 -
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 の挙動
git fetch lib
- リモートリポジトリ (lib) の情報を取得し、ローカルにリモート追跡ブランチ(例: lib/lib)として保存します。
- ただし、現在のローカルブランチには何も影響を与えません。
ローカルブランチはそのままで、リモート追跡ブランチが更新されるだけです。
git pull の挙動
git pull lib lib
-
fetch:
リモート (lib) の lib ブランチの最新状態を取得します。 -
merge:
取得したリモートの変更をローカルブランチに マージ します。
つまり
ローカルの変更や履歴を完全に上書きしてリモートの状態に一致させたい場合は、git reset --hard lib:lib
が最適です。
Discussion