はじめに
Webエンジニアになって2年目。そろそろ、add
、copmmit
、push
、pull
、あと、ブランチ切ること以外も覚えたいなと思い、Gitでずっと気になってた各種**「元に戻す操作」**を勉強がてら記事を書こうと思いました。
Gitの操作をしていると、失敗して元に戻したい時は結構多いんじゃないかなーと思います。戻したい場面はいくつかあると思います。
今回は、作業中に最新のコミットまで戻したいと思った時の対処について書いていこうと思います。
どんな場面か?
ローカル(ワーキング(作業)ディレクトリ)上で作業をしていて、ゴチャゴチャ書き過ぎてしまい、もういっそのこと最新のコミットに戻したいと思った時。
ワーキングディレクトリについては、下の図を見てください。
上記は、コミットまでに必要な2段階手順の模式図1です。
解決方法
例えば、最新のコミットした時のファイルの中身は、下記だとする
# あいさつ
- おはよう
- こんにちは
- こんばんわ
コミット直後に確認したらこんな感じ
$ git status
On branch master
nothing to commit, working tree clean
なんか色々書いて、エラーとかも出ちゃって、元の状態がわからなくなったとする。
# あいさつ
- おはよう
- こんにちは
- こんばんわわわ
- こんばんみ
- こんばんび
- こんばんぶ
確認したら
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: practice.txt
no changes added to commit (use "git add" and/or "git commit -a")
(use "git checkout -- <file>..." to discard changes in working directory)
これの意味は、ワーキングディレクトリの変更を放棄するにはgit checkout -- <file>...
を使って、です。
(「discard」は放棄という意味)
なので、今回の例では、こう書きます。
$ git checkout -- practice.txt
ファイルは最新のコミットの状態になります。
# あいさつ
- おはよう
- こんにちは
- こんばんわ
確認したら、こうなっているでしょう。
$ git status
On branch master
nothing to commit, working tree clean
オプション(--
)をつける理由
まず、git checkout
には2つの役割があります2。
-
- 作業ブランチを切り替える
-
- 指定したコミットにおける任意のファイルをワーキングディレクトリに反映する
また、git checkout
におけるファイルパスの指定方法はオプション(--
)をつけることです。
オプション(--
)をつける理由は、ファイル名と同じ名前のブランチ名があった場合作業ブランチが切り替わっちゃうからです。
実は、オプション(--
)をつけなくても、git checkout ファイル名
でもブランチ名と被ってなければ、場合に正しく動作します。ですが、万が一のためオプション(--
)はつけておきましょう。
注意すること
git checkout
の2つの役割の2つ目にあるように、git
はHEAD
、つまり現在チェックアウトしているブランチの最新の状態からチェックアウトするものとして扱います3。
ブランチを切り替える作業をよくしてる人はわかると思いますが、git
は checkout
してもなんの履歴も残りませんし、差分のデータを記録することもありません。言い換えると、同じブランチの任意のファイルにおいて、書き換えた最新の状態から最新コミットまでチェックアウト(元に戻す)します。なので、ファイルの変更は跡形も無くなります。まだコミットしていない内容なのでgitコマンドでは、もう二度と戻せないので、注意してください。
以上です。
親記事(まとめ記事)
この記事の親記事(まとめ記事?)がありまして、そこでは、gitを使ったさまざまな元に戻す方法の記事をまとめています。ぜひ、見てください。