質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

2回答

630閲覧

git rebaseの差分が期待通りにならない

sasa0330

総合スコア64

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

0グッド

0クリップ

投稿2023/09/24 03:45

編集2023/09/24 03:49

質問

git rebaseについて勉強中なのですが、以下のシチュエーションでrebaseの差分が期待通りになりません。

ブランチ構成

main b1 b1-1 b2 b2-1

手順

  • b1に移動して、修正 & コミット
  • b1-1に移動して、修正 & コミット & git rebase b1
  • b1に移動して、git merge b1-1
    • b1-1がb1にマージされる
  • mainに移動
  • git merge b1で、mainにb1を取り込む
  • b2に移動して、修正 & コミット
  • b2-1に移動して、修正 & コミット & git rebase b2
  • b2に移動して、git merge b2-1
  • b2で git rebase main
    • mainにb1の情報が入ったため、rebaseしたい

問題

最後のrebaseでコンフリクトの差分が出るのですが、b2-1の情報が差分に反映されません。
イメージ説明
手元のファイルではb2-1の情報が反映されています。
イメージ説明
原因を教えていただきたいです。

最終的にmainブランチのファイルを以下のようにマージしたいのですが、rebaseを使ったコミットの練習なのでmainブランチをb2にマージしてコンフリクト解消することは考えていません。

main b1 b2-1 b2 b2-1

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

  • b1に移動して、修正 & コミット [@1]
  • b1-1に移動して、修正 & コミット & git rebase b1 [@2]
  • b1に移動して、git merge b1-1 [@3]
    • b1-1がb1にマージされる
  • mainに移動
  • git merge b1で、mainにb1を取り込む [@4]
  • b2に移動して、修正 & コミット [@5]
  • b2-1に移動して、修正 & コミット & git rebase b2 [@6]
  • b2に移動して、git merge b2-1 [@7]
  • b2で git rebase main
    • mainにb1の情報が入ったため、rebaseしたい

文章だけ見てぱっとわからなかったので絵を描きました (上記@n は各コミットのハッシュだと思ってください)。

main b1 b1-1 b2 b2-1 ---- ---- ---- ---- ---- @7 | \ | @6 | | | : | / @5 | : / rebase中 ←今ここ / @4 | \ | @3 | | \ | | @2 | | | | | : | | / | @1 | | : :

rebaseはその名の通り、コミット履歴の起点 (ベース) を変更したうえで、元のベース以降に行ったコミットを再適用します。履歴の途中に別の履歴が割り込んでくることになるので、コミット再適用の際に変更の競合 (コンフリクト) が起きることがあります。競合が起きるとコミットの再適用は中断され、競合を解消してから続行するよう求められます。今がその時ですね。

今回は@5まで再適用したところで競合が起きたと思われます。@6を含むマージコミット@7はまだ再適用されていません。

git statusで見たときにboth modifiedなどとなっているファイルが競合を含むので、競合個所を適切に編集します。その後どうすればいいかはgit statusの出力に書いてあるとおりです。編集したファイルをgit addするなどして競合を解消し、git rebase --continueでrebaseを続行します。また競合が起きたら同じことをくりかえします。

ちなみに、競合を解消した結果として再適用できる変更がなくなってしまうことがあります (新しいベースのほうの変更を採用して再適用されるコミットの変更を破棄した場合、そうなります)。git rebase --continueしても「適用する変更が何もないよ」みたいなことを言われて進めなくなることがありますが、実際にその変更がもう再適用の必要がないのならgit rebase --skipでそのコミットをとばせば先へ進めます。

投稿2023/09/25 03:01

ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasa0330

2023/09/30 06:26

ありがとうございます! まさにこの状況だったようで、順番にコンフリクト解消したら全て適用できました。
guest

0

b2で git rebase main

この時点で、b2行編集コミットとb2-1行編集コミットが別々ならば、rebase時の対象コミットも複数になり
順番に取り込み(コンフリクト解消)していくことになるので、最初の取り込みが部分的に見えても特に問題はないかと。

コンフリクト解消中のブランチ表示が |REBASE 1/X とかになっていたら、単にX個の最初の1個目みたいな意味です。
普通に解消させて --continue していって、最終的にどうなるか確認してみてください


rebase開始前であれば、git log --oneline main..b2 とかで共通祖先からb2へのコミット差分(rebase移動対象のコミット)がどれだけあるか確認できます

投稿2023/09/24 07:03

pecmm

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasa0330

2023/09/30 06:27

> 普通に解消させて --continue していって、最終的にどうなるか確認してみてください これで大丈夫でした!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問