« 「git rebase」はコミットの移動ではない | メイン | Firefox限定 加速度センサーとCSSのTransform2Dをあわせて使う »

「git rebase --onto newbase upstream branch」の意味

やっと「git rebase」のちゃんとした動きを把握したと思うので書いておく。

前回のエントリーで「git rebase」は正確にはコミットの履歴の移動でないと書いたが、ここでは説明のしやすさから、『移動』という言葉を使用する。
履歴ツリー上でリベースするためには、「『どこから』『どこまで』を『どこに』移動するのか」を知る必要がある。もう少し整理すると、「移動する上流側(祖先側)の位置」「移動する下流側(子孫側)の位置」「移動先(新しい親)の位置」となる。

これら全てを指定するのが「git rebase [--onto <newbase>] <upstream> [<branch>]」という書き方になる。

定義は以下の通りのはず。

「移動先の位置」
<newbase>が使用される。
ただし、省略された場合は、<upstream>が使用される。
ブランチでなくてもよい。

「移動する上流側の位置」
<upstream>が使用される。
ただし、<upstream>が「移動する下流側の位置」の直接の祖先でない場合、<upstream>と「移動する下流側の位置」の共通の祖先の位置となる。
ブランチでなくてもよい。

「移動する下流側の位置」
<branch>が使用される。
ただし、省略された場合は、現在のブランチが使用される。
ブランチでなくてはならない。

また、移動するのは「移動する下流側の位置」から「移動する下流側の位置」の一本だけであり、履歴の枝が生えていてもそれらは無視される。これはリベースが実際にはコミットの履歴の移動ではなく、コミット内に記録されている変更内容を移動先に順番に適用していくため。
「ブランチのHEADをチェックアウト」し、「<newbase>と<branch>を省略」して「git rebase <ustream>」を実行した場合の動きは、履歴を「木」のメタファーで説明していると「接ぎ木をしている」ように見え、そう説明する人もいる。しかし、内部の動作はそうはなっておらず、同じ変更内容を持った別のコミットを生成している。Gitを学習する時に、表面上な動きだけではなく、内部構造がどうなっているのか把握しておいた方が良いと言われるのは、このようなところに理由があるのだろうと思った。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google

タグ クラウド