リベースがリポジトリーを共有しているユーザーに与える影響の例
「リベース」が、リポジトリーを共有しているユーザーに与える影響の例です。共有しているリポジトリーの管理者が自分であっても、他のユーザーへの影響を配慮する必要があります。
ここでは、共有しているリポジトリーを利用しているAさんが、どういう状況でどう困るのかを見てみます。
1.リモートリポジトリーの状況
「リモートリポジトリー」は、以下のようになっています。このリポジトリーは共有されており、Aさんはこのリポジトリーで作業を行うため、リポジトリーをAさんのPCにコピー(クローン)します。
2.Aさんが作業を行う(Aさんのローカルリポジトリー)
「リモートリポジトリー」をクローンし、Aさんは自分の「ローカルリポジトリー」で「My」ブランチを作成しました。Aさんは「My」ブランチで、2回コミットを行いました。
「Commit2」と「Commit3」です。
3.リモートリポジトリーが変更される(リモートリポジトリー)
別のユーザーであるBさんが、Bさんの「ローカルリポジトリー」で行った作業を、「リモートリポジトリー」に反映しました。「リモートリポジトリー」は、以下のようになりました。
「Commit4」と「Commit5」をマージして、「Commit6」を生成しています。
この時点で、Aさんのリポジトリーは「2.」のままです。
4.リモートリポジトリーのフェッチ(Aさんのローカルリポジトリー)
ここでAさんは、「リモートリポジトリー」が変更されていることに気づき、作業も一区切りついたので、「リモートリポジトリー」をフェッチしました。Aさんは、「リモートリポジトリー」で行われた変更内容を、自分のブランチに取り込みたいと考え、「origin/master」ブランチと「My」ブランチをマージしました。
「Commit7」はマージコミットです。
5.コミットの取り消しとリベース(リモートリポジトリー)
その後Bさんが、「3.」で行った変更を取り消しリベースを行いました。まず「Commit6」を取り消し、「Commit5」と「Commit4」が存在するブランチをリベースしました。
リベース元のブランチは、「Commit4」があるブランチです。
リベース先のブランチは、「Commit5」があるブランチです。
「Commit6」を取り消したので、「Commit6」は削除されました。
リベースを行ったので「Commit4」は削除され、「Commit4’」が生成されました。
この時点で、Aさんのリポジトリーは「4.」のままです。
6.リモートリポジトリーをフェッチ(Aさんのローカルリポジトリー)
Aさんは、「リモートリポジトリー」をフェッチしました。すると、Aさんの「ローカルリポジトリー」は、以下のようになります。
サーバのリポジトリーでは削除されたはずの「Commit4」と「Commit6」が、Aさんの「ローカルリポジトリー」では有効なままです。
7.ブランチのマージ(Aさんのローカルリポジトリー)
Aさんは、「My」ブランチでの作業が完了しました。Aさんは、自分が行った作業を「リモートリポジトリー」へ反映するため、「origin/master」ブランチと「My」ブランチをマージしました。
Aさんのリポジトリーは、以下のようになります。
「Commit8」はマージコミットです。
8.ログの確認(Aさんのローカルリポジトリー)
Aさんは、自分が行った作業を「リモートリポジトリー」へ反映する前に、自分が行った変更内容と矛盾する変更内容がないか、 変更履歴を確認しました。この時、全く同じ変更内容が2つ表示されます。
「Commit4」の変更内容と「Commit4’」の変更内容です。
Aさんは混乱し、何が起きているのかよく分からない状況になります。
9.リモートリポジトリーへ反映(Aさんのローカルリポジトリー)
ここでもしAさんが、そのまま自分の「ローカルリポジトリー」を「リモートリポジトリー」に反映させたとします。そうすると、Bさんが削除したはずの「Commit4」と「Commit6」が「リモートリポジトリー」に追加されます。
こうなると、今度は他のユーザーもAさんと同じ混乱状況になります。
履歴の上書き
上記の例では、各ユーザーが異なる「リモートリポジトリー」の履歴を「ローカルリポジトリー」に保持していたため、「リモートリポジトリー」の履歴の上書きがAさんとBさんの間で行われていました。マージは履歴を追加していくため、ユーザーは新規に追加された履歴を確認すれば、何が変更されたのかを把握し易くなります。
一方リベースは履歴を改変してしまうため、ユーザーは新規に追加された履歴だけでなく、過去の履歴がどう変わったのか把握する必要があります。