Blog

git reset –hard でコードを完全に戻せなかった理由

開発をしていて、remoteに正しいコードがあり、ローカルで再度手順の確認をするために gitコマンドで戻った。

git reset --hard <commit id>

で同じように実装してコードを確認できたので、git stash (今の変更を他の領域に一時退避するコマンド)したのちに、下記コマンドを実行したけれど、コードが完全にリモートと同じではない部分がある。

git pull -f  origin < branch_name >

調査してみると、HEADというポインターも一緒に戻す必要があった。

HEADはGitで現在チェックアウトしているコミットを指し示すポインターです。通常、これは作業中のブランチの最新コミットを指します。HEADが指しているコミットは、リポジトリの作業ディレクトリの内容を表しており、Gitコマンドを使って操作する際の基点となる。

git reset --hard HEAD コマンドを使用すると、以下のことが行われるようだ。

  1. インデックス(ステージングエリア)のリセット
    このコマンドはインデックスを HEAD コミットの状態にリセットします。つまり、git add でステージされた変更がすべて解除される。
  2. 作業ディレクトリのリセット
    作業ディレクトリ内のファイルが HEAD コミットの内容に完全に一致するように変更されます。これにより、HEAD 以降に行われた未コミットの変更(ファイルの追加、変更、削除)がすべて破棄される。

簡単に言うと、git reset --hard HEADは現在のブランチの最後のコミット状態にすべてを戻すコマンドです。これを使用すると、そのブランチにおける最新の確定した状態(最後のコミット)に、インデックスと作業ディレクトリが再設定されます。

なのでリモートのブランチの内容をローカルに完全に反映させ、ローカルの変更を完全に破棄するにははつぎのようなコマンドを利用すべきだった。

  1. ローカルの変更を完全に破棄
    ローカルの変更(スタッシュを含む)を全て破棄するには、以下のコマンドを実行します。これにより、ローカルに加えたすべての変更が失われるので注意してください
//ポインターも戻す
git reset --hard HEAD

//退避場所も保険でクリアしておく
git stash clear
   
  1. リモートブランチから強制的にプル
    リモートのブランチから最新の状態を強制的にプルし、ローカルのブランチをリモートの状態に一致させます。ここで使用するのは git fetchgit reset の組み合わせです。
//リモートをローカルにもってくる マージはされない
git fetch origin

//--hardを使ってリモートをローカルに反映
git reset --hard origin/branch_name

このコマンドは、リモートの branch_name ブランチの最新状態を取得し、ローカルのブランチをその状態にリセットします。これにより、ローカルの環境がリモートの状態に完全に一致する。

これらのコマンドを実行することで、ローカルのリポジトリの状態はリモートのブランチと完全に一致するようになります。これにより、リモートの最新のコードと完全に同期することができます。

結論

  • reset –hard HEAD でポインターも一緒に移動しておく。

しかしGit考えた、リーナス・トーバルズさんは偉いな〜 と思う今日このごろでした。

リーナス・トーバルさん(フィンランド出身)の名言を参考までに掲載しておきます

  • 長期的な見通しやビジョンはあえて持たないようにしている。新しいものが出てきたときに、そのほうが自由に対応できるから。
  • 一般的に言って、白と黒しかないというような考え方は、私はあまり好きではありません。それが合理的であれば、灰色であってもいいと思います。
  • 問題を理解し解決するのは、その問題を最初に記述した人間ではない。
  • 技術は、それを意識しないで使えるようになったとき、技術だと思う人はいなくなる。
  • でも、本当のことだ。君は自分の世界を作ることができる。君にできることを制限するのは、君自身の能力だ。

一つ前の記事 Flutter error CocoaPods did not set the base configuration of your project because your project already has a custom config set.
次の記事 WordPress テンプレート階層が認識されない