🦥

Git のブランチを別のブランチへ付け替える (--onto)

2022/10/16に公開

以前に Gist で書いていたメモにコメントを頂いて知識が更新されたので、せっかくなので Zenn にも転載しようかと。 (MermaidGitgraph 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

これの branch1rebase したら

こうなってしまった

そのまま branch2rebase する

branch2 を新しい branch1rebase すると

$ 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

コンフリクトがなければこうなる。

GitHubで編集を提案

Discussion