https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git
親指のルール
- 使用
~
時間のほとんどを-あなたが望むものを、通常、世代数を戻って - 使用し
^
、彼らは二つ以上の(即時)親を持っているので-マージコミットに
ニーモニック:
- チルダは
~
、外観ではほぼ線形であり、直線で後方に行きたいです - キャレットは、
^
ツリーの興味深いセグメントまたは道路の分岐を示唆しています
チルダ
指定「の改訂」セクションgit rev-parse
のドキュメントを定義し~
て
<rev>~<n>
例えば、master~3
接尾辞~<n>
リビジョンパラメータには、コミットオブジェクトを意味n個のみの最初の両親、以下、オブジェクトをコミットという名前の世代の祖先を。[例えば、]<rev>~3
と等価である<rev>^^^
と同等です<rev>^1^1^1
...
あなたは、いずれかの親に得ることができるだけではなく、コミットHEAD
。また、世代を戻すことができます。たとえば、master~2
マージコミットの最初の親を好む、マスターブランチの先端の祖父母を意味しています。
キャレット
Gitの履歴は非線形である:非循環有向グラフ(DAG)またはツリー。1人のだけの親でコミットし、rev~
そしてrev^
同じことを意味します。そして生物学から借り言語を株-キャレットのセレクタは、それぞれが2つの以上の親の子であるため、マージコミットして便利になります。
HEAD^
最初の意味即時現在のブランチの先端の親を。HEAD^
略でHEAD^1
、あなたも対処できるHEAD^2
というように、適切な。同じセクションgit rev-parse
のドキュメントは、として定義され
<rev>^
、例えばHEAD^
、v1.5.1^0
接尾^
改訂パラメータには、そのコミットオブジェクトの最初の親を意味します。^<n>
意味N親番目([ 例 ]<rev>^
と等価です<rev>^1
)。特別なルールとして、<rev>^0
それ自体をコミット手段とするときに使用される<rev>
コミットオブジェクトを参照するタグオブジェクトのオブジェクト名です。
http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde
私は、今日のGitで遊んで少し時間を過ごし^(キャレット)と〜(チルダ)仕事を特異的な方法と私は私が忘れた場合にここでそれを文書化しようと思いました。
ショートバージョン
あなたはより深い説明をしたい場合は、「ロングバージョン」まで進んでください。
ref~
省略形ですref~1
とのコミット最初の親を意味します。ref~2
コミットを意味最初の親の最初の親は。ref~3
コミットを意味最初の親の最初の親の最初の親を。等々。
ref^
省略形ですref^1
とのコミット最初の親を意味します。しかし、ここで両者が異なることはつまりref^2
のコミットを意味第二の親を(彼らがマージされたときにコミットし、2人の親を持つことができ、覚えておいてください)。
^と〜演算子は組み合わせることができます。
ここでは出発点としてHEADを使用して、さまざまなコミットを参照する方法を示した図です。
HEAD〜1 ^ 2は、第2の親的的最初の親をコミット
ロングバージョン
私はそれにいくつかのコミットを持つダミーのリポジトリを作成しました。
$ git log --graph --oneline
* 8329384 Seventh commit
* f5717b0 Merge branch 'my_branch'
|\
| * 956c87d Fourth commit on a branch
* | a8fe411 Sixth commit
|/
* c7c2590 Third commit on a branch
* 86362ff Second commit on a branch
* 748855b First commit on a branch
* 1855b25 Fifth commit
* 67cf3a7 Fourth commit
* ea29778 Third commit
* 28c25b1 Second commit
* cd00b76 First commit
下部に開始し、早期のコミットはストレートマスターに行われました。
コミットから始まる748855b
とまで移動するには、c7c2590
枝の上に作られ、マスターにマージが、変更は平均時間でマスター上で行われていなかったました。
コミットa8fe411
とは、956c87d
同時に別々の枝に行われました。これらはコミットで一緒にマージされましたf5717b0
。
最後に、8329384
ストレートマスターにコミットされました。
我々は使用することができgit show
、個々のコミットを見て。
あなたはすでにそれは知っているよHEAD
、現在の枝の先端までのポイント:
$ git show --oneline HEAD
8329384 Seventh commit
コミットの次のキャレット記号(^)を入れるとそのコミットの親を意味しています。そこで、以下ではの親が表示されますHEAD
:
$ git show --oneline HEAD^
f5717b0 Merge branch 'my_branch'
...
HEAD^
言うの省略形ですHEAD^1
文字通りその親1コミット私を見る意味は、。あなたも言うことができるHEAD^2
が、この場合にはそれがどんな意味を成しません。
$ git show --oneline HEAD^2
fatal: ambiguous argument 'HEAD^2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
そのためHEAD
1つのだけの親を持っています。
しかしf5717b0
、二つのブランチがマージされたポイントは、両親、マスターの1と分岐のいずれかになります。
$ git show --oneline f5717b0^1
a8fe411 Sixth commit
...
$ git show --oneline f5717b0^2
956c87d Fourth commit on a branch
...
チルダ記号(〜)は、同様の方法で動作します。実際にはHEAD~
同じのようにコミット参照しますHEAD^
。
ここでも、HEAD~
の省略形ですHEAD~1
が、ここではこれが最初の祖先を意味HEAD
- HEAD~2
の第二の親ではありませんHEAD
が、祖父母のHEAD
:
$ git show --oneline HEAD~1
f5717b0 Merge branch 'my_branch'
...
$ git show --oneline HEAD~2
a8fe411 Sixth commit
...
$ git show --oneline HEAD~3
c7c2590 Third commit on a branch
あなたが見ることができるように、956c87d Fourth commit on a branch
チルダ演算子を使用している場合は表示されません。チルダオペレータは、常にあなたが最初に親の親を表示する前提だからです。
チルダとキャレット記号を組み合わせることが可能な第2の親の親にアクセスするには:
$ git show --oneline HEAD~1^1
a8fe411 Sixth commit
...
$ git show --oneline HEAD~1^2
956c87d Fourth commit on a branch
...
この方法では、いずれかがあなたのリポジトリの履歴にコミット参照することができるはずです。