経緯
研究室の様式(自分の場合はTeXの環境と使用例)をcloneして使っていたところ,間違ってその様式に自分の変更をpullしてしまい,様式を上書きしてしまいました...
内心)自分は何をしているんだ.
解決方法
もっとスマートなやりかた(ローカルデータはそのままでリモートのデータだけ戻す)がありそうですが,ローカルとリモートの両方のデータを元に戻す方法を書きます.
- まずは,自分が変更したファイルをバックアップしておきます
git reset --hard HEAD^
[解説]
ローカルのデータ(コミットとステージ)を強制的に(--hard)戻す(reset)方法です.
※(--soft等は,補足欄で解説)
この状態では,まだリモートのデータは反映されておらず,自分が誤ってpullしたデータが残ったままです.
- 最新状態でpullをする
git push -f origin master
[解説]
VSCodeの拡張機能「GitGraph」でも"git status"コマンドでもいいのですが,現在のmaster(最新状態)がどこにいるのかが分かるかと思います.
その状態で強制的にpullをすることで,リモートのデータを前の状態に戻す(一個前の状態で"上書"する)ことができます.
どうなるのか
最終的に,ローカルは一個前(コミットする前)に戻ります.
リモートのデータも,同じく,pullする前に戻ります.
気になる変更履歴(時間も)ですが,自分が間違ってpullする前に完全に戻ります.
つまり,変更した時間の履歴も元にもどるので,誰かが上書して元に戻したという痕跡さえ消すことができます.
これでトンズラ完了ですね.
補足
1. resetのオプション
--soft
コミット履歴: 指定したコミットに戻します。
ステージングエリア: そのまま残ります。
作業ディレクトリ: そのまま残ります。
特徴: コミットを取り消したいけれど、変更内容を保持して別のコミットを作成したい場合に使用します。
--mixed (デフォルト)
コミット履歴: 指定したコミットに戻します。
ステージングエリア: リセットされます(ステージングから外れる)。
作業ディレクトリ: そのまま残ります。
特徴: ステージングエリアをクリアして、変更を作業ディレクトリに戻したい場合に使用します。
--hard
コミット履歴: 指定したコミットに戻します。
ステージングエリア: リセットされます(クリアされる)。
作業ディレクトリ: 完全にリセットされます(変更が失われます)。
特徴: 作業ディレクトリを含めて完全に元に戻したい場合に使用します。
2. masterとorigin
項目 | 説明 |
---|---|
origin | リモートリポジトリの名称 |
origin/master | リモートリポジトリ「origin」のブランチ「master」を追跡するブランチ |
master | ブランチの名称 |
3. headとは