Git のブランチを別のブランチへ付け替える (--onto)
以前に Gist で書いていたメモにコメントを頂いて知識が更新されたので、せっかくなので Zenn にも転載しようかと。 (Mermaid の Gitgraph Diagrams を使ってみたかったというのもあります)
そのような感じで、たまに --onto を使おうとすると忘れているのでメモ。
基本(普通に rebase)
これを
こうするには
以下のように rebase を使う。
$ git rebase develop branch1
現在のブランチが branch1 だった場合はこうでも大丈夫。
$ git rebase develop
なお、実行するとコミット「D E F」のハッシュ値などは変更されます(この記事では変更されたコミットに枝番を付けます)。
例1
これを
こうするには
以下のように --onto を使う。
$ git rebase --onto develop branch1 branch2
意味としては、
-
developへ付け替える - 付け替えるのは
branch2 -
branch2の上流(branch2の分岐元)はbranch1
となります。
例2
これの branch1 を rebase したら
こうなってしまった
そのまま branch2 も rebase する
branch2 を新しい branch1 へ rebase すると
$ git rebase branch1 branch2
warning: skipped previously applied commit <HASH値>
warning: skipped previously applied commit <HASH値>
warning: skipped previously applied commit <HASH値>
hint: use --reapply-cherry-picks to include skipped commits
hint: Disable this message with "git config advice.skippedCherryPicks false"
こうなる。
rebase のデフォルトの挙動では対象になるコミットの内容を読みとって比較します(詳細はこちら)。よって、branch2 に含まれている「D E F」は「D-1 E-1 F-1」と同一として扱われるのでスキップされます。 (Gitst のコメントで教えてもらいました、ありがとうございます)
また、上記のスキップは branch1 にコミットを追加していても機能します。
branch2 の存在を忘れていて branch1 を更新してしまった(コミット c ができている)
branch2 の存在を思い出して rebase すると
$ git rebase branch1 branch2
warning: skipped previously applied commit <HASH値>
warning: skipped previously applied commit <HASH値>
warning: skipped previously applied commit <HASH値>
hint: use --reapply-cherry-picks to include skipped commits
hint: Disable this message with "git config advice.skippedCherryPicks false"
Successfully rebased and updated refs/heads/branch2.
コンフリクトがなければこうなる。
-onto が必要な場合
F-1 を --amend して F-2 がで出来てしまった
この後に rebase すると F がスキップされないのでコンフリクトしやすい。
以下のように、branch2 の分岐元としてコミット F(元の branch1)のハッシュ値(今回の例では 53c6b6 とする)を指定
$ git rebase --onto branch1 53c6b6 branch2
コンフリクトがなければこうなる。
Discussion