こんにちは。monipla facebookを担当している佐藤(ま)です。
アライドでは「大佐」と呼ばれております。
最近Gitの操作にも慣れてきましたが、SourceTreeは未だ手放せません。
さて今回は、関連性はありませんが「HEAD^ HEAD~」と「ダブルドット/トリプルドット」について書いていきたいと思います。個人的に最初少しとっつきにくかったので。
HEAD^とHEAD~
まず、HEADとは「今いるブランチの最新コミット」のことですね。
つまり「git show HEAD」とすれば最新のコミット情報が見れることになります。
なのでHEADを起点にすればわざわざハッシュを指定しなくてもコミットログを見ることができます。
1 2 3 |
・一つ前のコミットをみたいとき $ git show HEAD^ $ git show HEAD~ |
1 2 3 4 5 |
・三つ前のコミットをみたいとき $ git show HEAD^^^ $ git show HEAD~3 $ git show HEAD~~~ ※ $ git show HEAD^3は違う |
これらのコマンドは同じ結果を表します。ただし「HEAD^3」とすると意味が違ってくるので注意が必要です。詳しくはこちらやこちらのサイトが参考になります。
※ちょっと指摘があったので追記しました。
また、gitのv1.8.5からは、大文字「HEAD」の4文字を打たなくて済むよう「@」というエイリアスが用意されたので以下のようにも書くことができます。
1 2 3 |
$ git show @^^^ $ git show @~3 $ git show @~~~ |
これだけでもv1.8.5にアップデートする価値はありますね。v1.8.5の情報についてはこちらのサイトが参考になります。
過去にさかのぼった後にコミットした場合
ここで少し話はそれますが「HEAD」に関連することととして以前質問されて?と思ったことがあったので書いておきます。過去にさかのぼった後にコミットしたらどうなるの?という話です。
例えば、以下のようなブランチがあったとして「git checkout C」とすると「HEAD」は「C」の位置に移動します。「git show HEAD」では「C」のコミット情報が表示されます。
1 2 3 4 |
A - B - C - D - F - G ← master | C ↑HEAD |
このとき「HEAD」の位置が変わると同時に以下のような[warning]が出ます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Note: checking out 'f7702a8d35b6f4a10f30aa8a13d54994b11e03cd'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b new_branch_name HEAD is now at f7702a8... C |
[warning]には、HEADがブランチから切り離されたよ、変更しても影響ありませんよ、戻れますよ、コミット残したければブランチ切ってよ。みたいなことが書いてあります。つまりこの時点で「master」とは独立したブランチ(detached HEAD)にいることになります。
そして[warning]を無視して新しく「H」をコミットしてみると「master」ではなく独立したブランチ(detached HEAD)へコミットされます。
1 2 3 |
A - B - C - D - F - G ← master ∟ - H ← detached ↑HEAD |
そして「git checkout master」で戻ろうとすると以下のような[warning]が出ます。
1 2 3 4 5 6 7 8 9 10 11 |
Warning: you are leaving 1 commit behind, not connected to any of your branches: c459383 H If you want to keep them by creating a new branch, this may be a good time to do so with: git branch new_branch_name c459383 Switched to branch 'master' |
[warning]には、1コミット残ってるよ、残したかったらこのコマンド打ってね。みたいなことが書いてあります。そこで書いてある通りのコマンドを打てばコミットを残せます。(mergeしてもOKです。)
1 |
$ git branch new_branch_name c459383 |
たまに見落としがちですが、なにかあったらどうなってるからこれをしてね、といったことを教えてくれているので[warning]や[error]はよく読むことが重要ですね。
ダブルドットとトリプルドット
次にダブルドットとトリプルドットについてです。
ダブルドット
例えば以下のように「C」からfeatureブランチを切って進めていった時に「feature/foo」だけのコミットログを見たい場合あると思います。
1 2 |
A - B - C - D ← develop ∟ - E - F - G ← feature/foo(current) |
このとき「git log」で見てみると「A B C E F G」と出てしまい、どこからが「feature/foo」のコミットだかが分かりにくいのですが、以下のコマンドを使うことで「feature/foo」ブランチで加えた変更(E F G)だけを出すことができます。
1 |
$ git log develop..feature/foo |
トリプルドット
トリプルドットは、feature/foo、developのどちらか一方からのみたどれるコミット(つまり両方からたどれるコミット以外)を見たい場合(D E F G)に使います。
1 |
$ git log develop...feature/foo |
また「–left-right」オプションを使うとどっちのコミットに存在するかを表してくれるので便利です。
1 2 3 4 5 |
$ git log --left-right develop...feature/foo < D > E > F > G |
GitについてはPro Git(日本語版)がいろいろ分かりやすく詳細に書いてあるので参考になります。
今回は以上になります。
アライドアーキテクツではエンジニアを随時募集しております。
興味があればぜひこちらの採用サイトからご応募ください。
よく使うであろうことをできるだけ分かりやすく発信していきます。 Gitの情報を無駄にキャッチアップしてます。