Gitで、HEAD^[n]とHEAD~[n]とHEAD@{[n]}の違いが分かってなかったので書いとく

More than 1 year has passed since last update.

おそらくこんなかんじっぽい。
※ざっくり書いて公開しちゃったけど、もう少し詳しく補足しました(2013/09/15 17:13)

それぞれ説明してみる

HEAD^[n]

git logで出力される変更履歴(コミットログ)を参照してる。
この場合のnは、「n番目の親コミット」の意。
git mergeとかした場合にマージ元となっている親ブランチが複数あった場合にnで指定してたどれるようです。
ぼくが使ってるリポジトリで試したらHEAD^2くらいまでしか辿れなかったんで、あんまり使いどころ実感してないんですけど…

HEAD~[n]

git logで出力される変更履歴(コミットログ)を参照してる。
この場合のnは、「n世代目の親コミット」の意。
基本的には(この場合は起点をHEADとして)git logのタイムラインを遡るイメージでnを利用できます。要は、git show HEAD^^^^git show HEAD~4は同義。

HEAD@{[n]}

git reflogを参照してる。Gitを操作した記録がなされてて、それベース。
reflogはHEADの動きを記録しているもので、Gitにトラッキングされているファイルの操作で何かミスをした場合にgit reset (--hard) HEAD@{[n]}とかで復旧することが可能らしいです(ぼくは幸いなことに、まだこれを利用する状況に陥ったことはないです)。

おわりに

何か起こったときにちゃんと対処できるように、このへんの違いを理解しとくとよさそうです。

参考

  • Linked from these articles
  • Linked from 備忘録Git
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.