gitの仕様が変わったためか、ぐぐって出てくる情報だとたまに古いのか新しいのか分からないのでgit 1.7.2.5で動いた情報を共有。
新しくコミットしたものの、あるファイルだけ特定の古いコミットの物で上書きしたくなるときがあります。
動かなかったやり方
$ git checkout HEAD^:hoge.py
で、1個前のコミットのhoge.pyを持ってきて現在の作業ディレクトリに上書きできる、と書いている事もあります。
fatal: reference is not a tree: HEAD^:hoge.py
と出て動かないという状況になることもあります。
動いたやり方
こうしたら動きました。
$ git checkout HEAD^ -- hoge.py
古いドキュメントのものとは記法が違うみたいです。成功したらgit status
で状況を見てみましょう。
git diff
の時も同様のようです。
$ git diff HEAD^:hoge.py # NG
$ git diff HEAD^ -- hoge.py # OK(HEAD^から現在の最新の状態になるまでのdiffが表示される)
ですがgit show
は動く様子。
$ git show HEAD^:hoge.py # OK(ファイルの内容が表示される)
$ git show HEAD^ -- hoge.py # OK(最新の状態からHEAD^に変更するためのdiffが表示される)
以下gitがわかってる人には不要な情報
HEAD^
は一個前のコミットという意味でありHEAD^^
は二個前のコミットを意味します。
必要に応じて^
を付けましょう。
HEAD^^^^^
などと付けていくとどれを指してるか分からなくなって事故の元なのでgit log
コマンドでコミット一覧を見て、commit eda012e1...
などと書いてある行から
$ git checkout eda012 -- hoge.py
などとコミットログのIDの先頭6文字位を指し示せばよしなに動いてくれます。
既にブランチ名やタグが振ってあるコミットの場合にはその名前を使っても行けるはず。