sato.masaki

2014.01.15

GitのHEAD^ HEAD~やらダブルドット トリプルドットやら

こんにちは。monipla facebookを担当している佐藤(ま)です。
アライドでは「大佐」と呼ばれております。

最近Gitの操作にも慣れてきましたが、SourceTreeは未だ手放せません。
さて今回は、関連性はありませんが「HEAD^ HEAD~」と「ダブルドット/トリプルドット」について書いていきたいと思います。個人的に最初少しとっつきにくかったので。

HEAD^とHEAD~

まず、HEADとは「今いるブランチの最新コミット」のことですね。
つまり「git show HEAD」とすれば最新のコミット情報が見れることになります。

なのでHEADを起点にすればわざわざハッシュを指定しなくてもコミットログを見ることができます。

これらのコマンドは同じ結果を表します。ただし「HEAD^3」とすると意味が違ってくるので注意が必要です。詳しくはこちらこちらのサイトが参考になります。
※ちょっと指摘があったので追記しました。

また、gitのv1.8.5からは、大文字「HEAD」の4文字を打たなくて済むよう「@」というエイリアスが用意されたので以下のようにも書くことができます。

これだけでもv1.8.5にアップデートする価値はありますね。v1.8.5の情報についてはこちらのサイトが参考になります。

過去にさかのぼった後にコミットした場合

ここで少し話はそれますが「HEAD」に関連することととして以前質問されて?と思ったことがあったので書いておきます。過去にさかのぼった後にコミットしたらどうなるの?という話です。

例えば、以下のようなブランチがあったとして「git checkout C」とすると「HEAD」は「C」の位置に移動します。「git show HEAD」では「C」のコミット情報が表示されます。

このとき「HEAD」の位置が変わると同時に以下のような[warning]が出ます。

[warning]には、HEADがブランチから切り離されたよ、変更しても影響ありませんよ、戻れますよ、コミット残したければブランチ切ってよ。みたいなことが書いてあります。つまりこの時点で「master」とは独立したブランチ(detached HEAD)にいることになります。

そして[warning]を無視して新しく「H」をコミットしてみると「master」ではなく独立したブランチ(detached HEAD)へコミットされます。

そして「git checkout master」で戻ろうとすると以下のような[warning]が出ます。

[warning]には、1コミット残ってるよ、残したかったらこのコマンド打ってね。みたいなことが書いてあります。そこで書いてある通りのコマンドを打てばコミットを残せます。(mergeしてもOKです。)

たまに見落としがちですが、なにかあったらどうなってるからこれをしてね、といったことを教えてくれているので[warning]や[error]はよく読むことが重要ですね。

ダブルドットとトリプルドット

次にダブルドットとトリプルドットについてです。

ダブルドット

例えば以下のように「C」からfeatureブランチを切って進めていった時に「feature/foo」だけのコミットログを見たい場合あると思います。

このとき「git log」で見てみると「A B C E F G」と出てしまい、どこからが「feature/foo」のコミットだかが分かりにくいのですが、以下のコマンドを使うことで「feature/foo」ブランチで加えた変更(E F G)だけを出すことができます。

トリプルドット

トリプルドットは、feature/foo、developのどちらか一方からのみたどれるコミット(つまり両方からたどれるコミット以外)を見たい場合(D E F G)に使います。

また「–left-right」オプションを使うとどっちのコミットに存在するかを表してくれるので便利です。

GitについてはPro Git(日本語版)がいろいろ分かりやすく詳細に書いてあるので参考になります。

今回は以上になります。
アライドアーキテクツではエンジニアを随時募集しております。
興味があればぜひこちらの採用サイトからご応募ください。