13,005
回編集
113行目: | 113行目: | ||
rebaseは、再度(re)起点を定める(base)という意味合いがある。<br> | rebaseは、再度(re)起点を定める(base)という意味合いがある。<br> | ||
<br> | <br> | ||
下図に、最初の状態 (rebase前) を示す。<br> | |||
mainブランチとtopicブランチが分岐しており、両ブランチで並行開発が行われているものとする。<br> | |||
[[ファイル:Git Merge Rebase 2.png|フレームなし|中央]] | |||
<br> | <br> | ||
まず、統合前の状態では、masterブランチとtopicブランチの間にコンフリクトが発生する。<br> | |||
それを避けるため、topicブランチの起点をmasterブランチの最新のコミットで置き換える。<br> | |||
<br> | |||
コンフリクトがあれば個別に解決する必要がある。<br> | |||
<u>rebaseでは、topicブランチのコミットを1つずつ順番にmasterブランチの最新の先端に付け加える処理が発生する。</u><br> | |||
<br> | |||
例えば、topicブランチ上において、masterブランチとコンフリクトが発生するファイルを何度も繰り返し変更している場合は、その都度、競合が発生する。<br> | |||
そのため、コミットの多いtopicブランチをrebaseする場合は作業が煩雑になる。<br> | |||
事前に、topicブランチの履歴を<code>rebase -i</code>コマンド等を実行して簡略化すると緩和できる。<br> | |||
<br> | |||
# topicブランチの起点が、mainブランチの最新コミットに移動する。 | |||
# topicブランチのコミットが順次適用されて、新しいコミット (3'、6'、8') として再作成される。<br>この過程でコンフリクトが発生する可能性があり、その都度解決が必要となる。 | |||
[[ファイル:Git Merge Rebase 3.png|フレームなし|中央]] | |||
<center>図. rebase後の状態 (topicブランチの起点が移動)</center><br> | |||
<br> | <br> | ||
ここでは、rebaseした後のコンフリクトの解決と実証が正常に終了したものとする。<br> | ここでは、rebaseした後のコンフリクトの解決と実証が正常に終了したものとする。<br> | ||
<br> | <br> | ||
次に、この変更をmasterブランチに取り込む。<br> | 次に、この変更をmasterブランチに取り込む。<br> | ||
masterブランチにチェックアウトして、<code>git merge --no-ff <ブランチ名 例: topic></code>コマンドを使用する。<br> | |||
<u>必ず、<code>--no-ff</code>オプションを付加すること。</u><br> | |||
<br> | |||
この時、topicブランチのコミットログがmasterブランチ側に残らないように配慮する必要がある。<br> | |||
<code>--no-ff</code>オプションにより、fast forwardを行わない独立したコミットが作成される。<br> | |||
<br> | |||
masterブランチのコミットログを見ると、基本的には直列の履歴かつ変更コミットが機能ごと (topicブランチごと) に独立して見える。<br> | |||
<br> | <br> | ||
# --no-ffオプションにより、マージコミットが明示的に作成される。 | |||
# topicブランチの変更が1つのまとまりとしてmainブランチに統合される。 | |||
# mainブランチの履歴が直線的に保たれる。 | |||
[[ファイル:Git Merge Rebase 4.png|フレームなし|中央]] | |||
<center>図. 最終的なmerge (--no-ff) 後の状態</center><br> | |||
<br><br> | <br><br> | ||