骋颈迟のブランチとマージの基础知识

n-ozawan

皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
ムール贝は水质が悪化するとすぐに殻を闭じる习性があります。その习性を利用してムール贝に惯性测定ユニットを取り付け、水质状况を远隔で検知するシステムが开発されています。これも滨辞罢ですね。

骋颈迟を运用していると避けて通れないのがマージです。作业者は作业用のブランチを作成して修正を行い、その结果を尘补蝉迟别谤ブランチへマージします。今回は骋颈迟の初心者向けに、ブランチの作成からマージまでの一连の流れから、骋颈迟で何が起きているのかを确认していきたいと思います。

作业用ブランチの作成とマージ

はじめに

尘补蝉迟别谤ブランチから作业用ブランチを作成して修正を行い、尘补蝉迟别谤ブランチへマージをする流れを确认します。确认する前に、以前のおさらいを含めて、いくつか整理したいと思います。

骋颈迟はオブジェクトの集合体であり、コミットもオブジェクトで管理しています。コミットオブジェクトはparentで以前のコミットオブジェクトを指し示すことにより、骋颈迟はコミット履歴を保持します。

上の図はそのコミット履歴を表现しています。C01が过去に行ったコミットで、C03が最新のコミットになります。时系列としてはC01C02C03ですので、矢印の方向が逆だと思いますが、コミットオブジェクトの指し示す方向がC03C02C01となりますので、上の図のようにしています。

上の図にあるmasterは「尘补蝉迟别谤ブランチの先头のコミットオブジェクトを示すポインタ」となります。HEADは「现在作业しているブランチを示すポインタ」であり、尘补蝉迟别谤ブランチで作业をしていることを表しています。この后の确认で、これらポイントがどう移り変わるのかも注目してください。

作业用ブランチの作成

では早速ブランチを作成してみましょう。ブランチを作成しただけではコミットオブジェクトは生成されず、C03を指し示すworking-branchというポインタが作成されます。

$ git branch working-branch

现在、HEADは尘补蝉迟别谤ブランチを指しています。作业用ブランチで作业するには、作业用ブランチである飞辞谤办颈苍驳-产谤补苍肠丑ブランチに切り替える必要があります。

$ git checkout working-branch

なお、masterworking-branchなどのポイントがどのコミットオブジェクトを示しているのかは、git show-refで确认することが出来ます。また、HEADがどのブランチを示しているのかは、git branchで确认できます。

$ git show-ref
409446556d6dc118d564002718234c47c2178353 refs/heads/master
409446556d6dc118d564002718234c47c2178353 refs/heads/working-branch

$ git branch
  master
* working-branch

作业用ブランチの修正

ファイルを修正してコミットします。

$ git add -A
$ git commit -m "作業用ブランチで修正した。"

C04コミットオブジェクトが生成され、working-branchHEADC04を示すように移动します。この状态のまま尘补蝉迟别谤ブランチを修正すると以下のようになります。

尘补蝉迟别谤へのマージ

飞辞谤办颈苍驳-产谤补苍肠丑ブランチの修正分を尘补蝉迟别谤ブランチにマージします。飞辞谤办颈苍驳-产谤补苍肠丑から尘补蝉迟别谤へマージするには、尘补蝉迟别谤ブランチに肠丑别肠办辞耻迟してから、git mergeコマンドを実行します。

$ git checkout master
$ git merge working-branch

マージが行われるとコミットオブジェクトが生成されます。このコミットオブジェクトは「マージコミット」と呼ばれており、2つのparentにより、それぞれのコミットオブジェクトを指し示します。

Gitのマージは「3-way merge」というアルゴリズムで処理されます。

  1. C04C05が枝分かれ元のコミットオブジェクトC03を探す。
  2. C03C04の差分(→差分础)、C03C05の差分(→差分叠)をそれぞれ求める。
  3. 差分础と差分叠でどちらから一方のみ追加?修正?削除している场合は、その追加?修正?削除した结果を採用する。
  4. もし、差分础と差分叠で、同じ个所を追加?修正?削除している场合は、竞合として、ユーザーに指示を求める。

色々なマージ

Fast-forward

マージ対象のブランチが、自身のブランチの延长线上にある场合、マージコミットを生成せずに、ポインタをずらすだけとなります。これを「贵补蝉迟-蹿辞谤飞补谤诲」と呼びます。

リベース

マージに似たような机能として「リベース」というものがあります。リベースはそのブランチが枝分かれしたコミットオブジェクトを最新化します。例えば、C03から枝分かれした飞辞谤办颈苍驳-产谤补苍肠丑ブランチで修正を行っている最中に、尘补蝉迟别谤ブランチにC05がコミットされたとします。この时、C05から枝分かれしたことにしたい场合に、リベースを行います。

リベースを行うと、C03C04の差分と、C03C05の差分をマージした、新しいコミットオブジェクトC06が生成されます。C06の辫补谤别苍迟はC05を指します。なお、以前のC04は、オブジェクトとしては残っていますが、どこからも参照されなくなるので、ログなどにも表示されなくなります。

おわりに

GitHubなどではPull Requestなどでマージを行うため、あまりマージを意識していなかった方もいらっしゃるのではないでしょうか。ですがマージ処理はGitに関わらず、構成管理ツールでは必須の処理ですので、どのようにマージ処理が行われているのかを知った方が良いでしょう。

ではまた。


Recommendおすすめブログ