【Git】分岐元(親ブランチ)に変更があった時の対処法
概要と目的
例えば最新のdevelopブランチからfeature/Aブランチを作成したとします。
さらにfeature/Aブランチで開発したものを前提として別の実装を進める必要があるため、feature/Aブランチからfeature/Bブランチを作り開発を行いました。
ところが、分岐元であるfeature/Aブランチに修正のコミットが入ってしまいます。
樹形図で言うと下記の様なイメージです。
feature/Bブランチを作成した時点と最新の状態では、feature/Aブランチの進み具合が違いますね。
このままではfeature/Bブランチでの開発に支障が出てしまったり、feature/Aブランチにマージする際に競合が起こる可能性もあります。
そこで、分岐する位置を下記の様に変更する際に私が行なっている手順をご紹介します。
ちなみに、feature/Bブランチでコミット前、かつfeature/Aブランチをチェックアウトした際に競合が起こらない場合は、一度feature/Bブランチを削除して最新のfeature/Aブランチから再作成しコミットすればOKです。
仮に競合が起こった場合は、変更を一度スタッシュしてfeature/Bブランチを再作成しスタッシュから適用、競合を解決、コミットと進んだ方が早いと思います。
使用するコマンド
cherry-pickを使用します。
cherry-pickを一言で説明すると、特定のコミットを取り込むためのコマンドです。
SourceTreeで行う
1.状況確認
feature/Aブランチからfeature/Bブランチを切ってコミットしていますが、その後feature/Aブランチで追加のコミットが入っています。
2.分岐先(子ブランチ)の名前を変更する。
ブランチ名を右クリックして「名前の変更...」を選択します。
続いて変更する名前を入力し「OK」を選択します。
今回はfeature/B-bkブランチにしました。
ブランチ名が変更されていればOKです。
3.最新のfeature/Aブランチから新たにfeature/Bブランチを作成する。
もし分岐元(親ブランチ)がリモートにある場合は、フェッチしてからプルして最新にしておくことをお忘れなく。
ブランチ名をダブルクリックしてfeature/Aブランチをチェックアウトします。
「ブランチ」を選択します。
ブランチ名を入力し「ブランチを作成」を押下します。
新しくfeature/Bブランチが作成されチェックアウトした状態になります。
4.feature/Bブランチにfeature/B-bkブランチのコミットを取り込む。
feature/Bブランチをチェックアウトしていることを確認します。
取り込みたいfeature/B-bkブランチのコミットを右クリックし「チェリーピック」を選択します。
任意で「mergeが成功した直後にコミットする」にチェックを入れて「OK」を選択します。
全く同じコミットをしたい場合はチェックを入れておけば良いと思います。
逆にコミットメッセージを変更したい場合や、ファイルを追加したり編集する場合はチェックをオフで。
feature/Bに欲しいコミットが作成されました。
5.残ったfeature/B-bkブランチを削除する。
feature/B-bkブランチ以外をチェックアウトした状態でfeature/B-bkブランチを右クリックし「feature/B-bk を削除」を選択します。
「強制的に削除」にチェックを入れ「OK」を選択します。
6.きれいになる
完成です。
コマンドラインで行う
1.状況確認
コミットグラフは以下の通りです。
$ git log --graph --all --decorate * commit 577564d011633ac2f7e6c25b3da2f97bc6b2486e (HEAD -> feature/A) | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:51:08 2020 +0900 | | feature/A commit. | | * commit 34cb7add56b0eea4d316e2ead41660525079d04f (feature/B) |/ Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:50:50 2020 +0900 | | feature/B commit. | * commit 5e9eef2383f4b05adfa99ddfeb189de19eb9f767 | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:49:44 2020 +0900 | | feature/A commit. | * commit 97aa2e4045050184c70edd6472a63a4cbaeaf06d (origin/master, master, develop) Author: chibichi9 <chibicat33@gmail.com> Date: Sun Mar 22 18:04:58 2020 +0900 Initial commit.
feature/Bブランチのコミットの位置で枝分かれしていますね。
そして参考までに、この時点のブランチ一覧です。
$ git branch develop * feature/A feature/B master
feature/Aをチェックアウトしている状態です。
2.リポジトリをクローンしたディレクトリへ移動する。
cdコマンドで移動します。
完全に私の環境のまま書かせていただきますが・・・。
$ cd /Users/chibicat/project/test
3.分岐先(子ブランチ)の名前を変更する。
「git brach -m 変更前ブランチ名 変更後ブランチ名」でブランチ名を変更します。
-m(--move)オプションはブランチ名を変更する際に使用します。
現在チェックアウトしているブランチ名を変更する場合は「git branch -m 変更後ブランチ名」でOKです。
$ git branch -m feature/B feature/B-bk
変更出来ているか確認します。
$ git branch develop * feature/A feature/B-bk master
4.最新のfeature/Aブランチから新たにfeature/Bブランチを作成する。
分岐元となるブランチに切り替えます。
今回は既にfeature/Aブランチにいるので不要なのですが一応。
$ git checkout feature/A
もしリモートのリポジトリの場合はfeature/Aブランチをチェックアウトした後に以下の通りプルすればOKのはずです。
$ git pull origin feature/A
「git checkout -b 作成するブランチ名」でfeature/Aブランチからfeature/Bブランチを作成しチェックアウトします。
-bオプションをつけないとブランチの作成が出来ません。
$ git checkout -b feature/B Switched to a new branch 'feature/B'
確認します。
$ git branch develop feature/A * feature/B feature/B-bk master
5.feature/Bブランチにfeature/B-bkブランチのコミットを取り込む。
「git cherry-pick コミットID」で今いるブランチに対象のコミットを取り込みます。
コミットIDは最初に確認した「git log」で確認出来ます。
$ git cherry-pick 34cb7add56b0eea4d316e2ead41660525079d04f [feature/B 6b05eb9] feature/B commit. Date: Sun Mar 22 20:50:50 2020 +0900 1 file changed, 6 insertions(+)
これでコミットを取り込むことが出来ました。
次の手順でfeature/B-bkブランチを削除するので、その前に本当にコミットを取り込めているか確認します。
$ git log --graph --all --decorate * commit 6b05eb964d4728463dd5dff33c64c15ee9deb728 (HEAD -> feature/B) | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:50:50 2020 +0900 | | feature/B commit. | * commit 577564d011633ac2f7e6c25b3da2f97bc6b2486e (feature/A) | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:51:08 2020 +0900 | | feature/A commit. | | * commit 34cb7add56b0eea4d316e2ead41660525079d04f (feature/B-bk) |/ Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:50:50 2020 +0900 | | feature/B commit. | * commit 5e9eef2383f4b05adfa99ddfeb189de19eb9f767 | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:49:44 2020 +0900 | | feature/A commit. | * commit 97aa2e4045050184c70edd6472a63a4cbaeaf06d (origin/master, master, develop) Author: chibichi9 <chibicat33@gmail.com> Date: Sun Mar 22 18:04:58 2020 +0900 Initial commit.
一番上にちゃんとありますね。
6.残ったfeature/B-bkブランチを削除する。
feature/B-bkブランチ以外をチェックアウトした状態で行います。
$ git branch -D feature/B-bk Deleted branch feature/B-bk (was 34cb7ad).
7.きれいになる
完成です。
ブランチ一覧。
$ git branch develop feature/A * feature/B master
そしてコミットグラフ。
$ git log --graph --all --decorate * commit 6b05eb964d4728463dd5dff33c64c15ee9deb728 (HEAD -> feature/B) | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:50:50 2020 +0900 | | feature/B commit. | * commit 577564d011633ac2f7e6c25b3da2f97bc6b2486e (feature/A) | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:51:08 2020 +0900 | | feature/A commit. | * commit 5e9eef2383f4b05adfa99ddfeb189de19eb9f767 | Author: chibichi9 <chibicat33@gmail.com> | Date: Sun Mar 22 20:49:44 2020 +0900 | | feature/A commit. | * commit 97aa2e4045050184c70edd6472a63a4cbaeaf06d (origin/master, master, develop) Author: chibichi9 <chibicat33@gmail.com> Date: Sun Mar 22 18:04:58 2020 +0900 Initial commit.