マージコミットを削除せずマージコミットを再生成し、リベースを行う
「マージコミット」を削除せず、マージコミットを再生成し、「リベース」を行います。デフォルトでは、リベース元の「マージコミット」は削除され、「コミットオブジェクト」の繋がり(履歴)が一直線になるようにリベースが行われます。
リベースでは、リベース元にブランチの分岐及び「マージコミット」が存在する場合、その構成を維持しつつリベースを行うこともできます。
マージコンフリクトに注意
リベース元の「マージコミット」で「マージコンフリクト」が発生し、ユーザーが「マージコンフリクト」の解決を行っていた場合、ユーザーがその「マージコミット」で行った変更内容は、リベース先で再現されません。従って、リベース先で「マージコミット」を行う際、同様に「マージコンフリクト」が発生します。
「マージコンフリクト」が発生すると、リベースが中断されます。
リベースを続行する場合、ユーザーは自分で再度「マージコンフリクト」の解消を行い、自分でコミットを行う必要があります。
その後リベースを続行します。
コマンドの実行例
コマンドの実行例です。1.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。現在のブランチは、「fix」ブランチであることが分かります。
同様に、「HEAD」は「fix」ブランチを指していることが分かります。
ここでは例として、「fix」ブランチを「master」ブランチにリベースし、「mastsr」ブランチに「fix」ブランチの変更内容を結合します。
2.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。マージコミットを再生成し「fix」ブランチを「master」ブランチにリベースするため、リベース対象の「コミットオブジェクト」は、以下のようになります。
- Commit4
- Commit5
- Commit6
- Commit7
- Commit8
- Commit9
- Commit10
- Commit11
3.コマンドの実行
コマンドのオプションは、以下のオプションを指定します。ショートオプション | ロングオプション |
---|---|
-p | --preserve-merges |
「端末」から、以下のコマンドを実行します。
コマンドの詳細は、「ファイルの変更内容を異なるブランチに結合するコマンドの説明」を参考にしてください。
ポイントは、赤字の箇所です。
git rebase --verbose --preserve-merges master
4.コマンドの実行結果
以下のように、リベース結果が表示されます。
ubuntu@ubuntu-vb-1504:~/git/myCloneProject$ git rebase --verbose --preserve-merges master
Changes from 2537d065f4f34d5c75093e1091a0ddcd4681c5fe to acb648c5ac895850a1b0c7735f6f7c66eb8d199f:
master.txt | 2 ++
1 file changed, 2 insertions(+)
Note: checking out 'acb648c5ac895850a1b0c7735f6f7c66eb8d199f'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at acb648c... master
Rebasing (1/8)
b3558792781286ca90af046c9318dd9072fe9014
[detached HEAD db323c4] fix
Date: Tue Aug 18 22:47:01 2015 +0900
1 file changed, 1 insertion(+)
create mode 100644 fix.txt
Rebasing (2/8)
2ce00c397fab7fda134ac653ce9f34c0b9ee005f
[detached HEAD 844ee73] fix
Date: Tue Aug 18 22:47:12 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (3/8)
598b799b338572cf37573da527346a56801d4abd
[detached HEAD 1aae9e8] fix
Date: Sat Aug 22 16:58:18 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (4/8)
5c27069677dfa335217b7186b3b9b744674c3935
[detached HEAD d7684ac] fix
Date: Sat Aug 22 16:58:22 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (5/8)
7a9a22b69ee0dc9fb3721955bf6df9d039d9ecfd
[detached HEAD 7be7266] new
Date: Sat Aug 22 16:57:41 2015 +0900
1 file changed, 1 insertion(+)
create mode 100644 new.txt
Rebasing (6/8)
14f68399e4c45ba130ff563bc4ddf1a8882bbb0a
[detached HEAD 86a9de3] new
Date: Sat Aug 22 16:57:50 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (7/8)
afb8162e649ee329bdb78ec21842731ac5d12234
Merge made by the 'recursive' strategy.
new.txt | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 new.txt
Rebasing (8/8)
c70a307c79de2d200b5c23d1c8e2f2905d508c6a
[detached HEAD 08597e6] fix
Date: Sun Sep 5 17:56:17 2015 +0900
1 file changed, 1 insertion(+)
master.txt | 2 ++
1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/fix.
Changes from 2537d065f4f34d5c75093e1091a0ddcd4681c5fe to acb648c5ac895850a1b0c7735f6f7c66eb8d199f:
master.txt | 2 ++
1 file changed, 2 insertions(+)
Note: checking out 'acb648c5ac895850a1b0c7735f6f7c66eb8d199f'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at acb648c... master
Rebasing (1/8)
b3558792781286ca90af046c9318dd9072fe9014
[detached HEAD db323c4] fix
Date: Tue Aug 18 22:47:01 2015 +0900
1 file changed, 1 insertion(+)
create mode 100644 fix.txt
Rebasing (2/8)
2ce00c397fab7fda134ac653ce9f34c0b9ee005f
[detached HEAD 844ee73] fix
Date: Tue Aug 18 22:47:12 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (3/8)
598b799b338572cf37573da527346a56801d4abd
[detached HEAD 1aae9e8] fix
Date: Sat Aug 22 16:58:18 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (4/8)
5c27069677dfa335217b7186b3b9b744674c3935
[detached HEAD d7684ac] fix
Date: Sat Aug 22 16:58:22 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (5/8)
7a9a22b69ee0dc9fb3721955bf6df9d039d9ecfd
[detached HEAD 7be7266] new
Date: Sat Aug 22 16:57:41 2015 +0900
1 file changed, 1 insertion(+)
create mode 100644 new.txt
Rebasing (6/8)
14f68399e4c45ba130ff563bc4ddf1a8882bbb0a
[detached HEAD 86a9de3] new
Date: Sat Aug 22 16:57:50 2015 +0900
1 file changed, 1 insertion(+)
Rebasing (7/8)
afb8162e649ee329bdb78ec21842731ac5d12234
Merge made by the 'recursive' strategy.
new.txt | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 new.txt
Rebasing (8/8)
c70a307c79de2d200b5c23d1c8e2f2905d508c6a
[detached HEAD 08597e6] fix
Date: Sun Sep 5 17:56:17 2015 +0900
1 file changed, 1 insertion(+)
master.txt | 2 ++
1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/fix.
5.ブランチの確認
現在のブランチ構成を確認すると、以下のようになっています。「fix」ブランチが指す「コミットオブジェクト」の識別子が、「1.」と異なっています。
6.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。「Commit4」の変更内容を元に、「Commit4’」が新規に生成されています。
「Commit5」の変更内容を元に、「Commit5’」が新規に生成されています。
「Commit6」の変更内容を元に、「Commit6’」が新規に生成されています。
「Commit7」の変更内容を元に、「Commit7’」が新規に生成されています。
「Commit8」の変更内容を元に、「Commit8’」が新規に生成されています。
「Commit9」の変更内容を元に、「Commit9’」が新規に生成されています。
「Commit10」の変更内容を元に、「Commit10’」が新規に生成されています。
「Commit11」の変更内容を元に、「Commit11’」が新規に生成されています。
通常のリベース
比較のため、同じブランチ構成で通常のリベースを行ってみます。1.コマンドの実行
「端末」から、以下のコマンドを実行します。コマンドの詳細は、「ファイルの変更内容を異なるブランチに結合するコマンドの説明」を参考にしてください。
git rebase --verbose master
2.コマンドの実行結果
以下のように、リベース結果が表示されます。3.ブランチの構成
現在のブランチの構成を図にすると、以下のようになっています。上記の「6.」と比較すると、「fix」ブランチの履歴が一直線になっています。
また、「Commit10」マージコミットは、リベース先に生成されていません。