最低限押さえておきたいgit rebaseの流れです。
実際に現場向けに作成した手順を汎用的な内容に整理しなおしました。
環境
- OS:Windows10
- Git:2.23.0
- 使用ツール:Git Bash
使用シーン
- 先に親ブランチに取り込まれた変更を作業ブランチにも取り込んで使う
- プルリクエスト(マージリクエスト)時のコンフリクト発生→修正からのビルドエラーの回避
- ブランチの分岐を減らし、綺麗な状態にする
etc・・・
イメージ図
イメージ図は以下の通り。
親ブランチをベースにgit rebaseすることにより、
①作業ブランチのコミットが親ブランチの最後尾のうしろに移動し、
②コミットハッシュ値が変わります。
手順
名称と手順中の具体値の対応を以下の通りとし、作業ブランチは親ブランチをもとに作成されたものとします。
名称 | 手順中の具体値 |
---|---|
ローカルリポジトリ | /c/work/hoge |
親ブランチ | develop |
作業ブランチ | feature/hoge_202007 |
(1) 対象のローカルリポジトリに移動
$ cd /c/work/hoge
(2) 作業ブランチのcommit or stash
ワークディレクトリにcommitされていないファイルがない状態にする
①commitの場合
$ git add .
$ git commit -m "コミットメッセージ"
②stashの場合
$ git stash
(3) 親ブランチに切り替える
$ git checkout develop
(4) 親ブランチにリモートリポジトリの内容を反映、最新の状態にする
$ git pull
(5) 作業ブランチに切り替え
$ git checkout feature/hoge_202007
(6) 親ブランチをベースにリベース
$ git rebase develop
(7) コンフリクトが起きた場合は以下のコマンドで対象を確認し、解消する(コンフリクトなしの場合不要)
$ git status
→ both modifiedと表示されるファイルが修正対象(一気に表示されないので、ひとつひとつ解消する&解消できたら、(8)のコマンドを実行する)
(8) コンフリクトが解消できたら、以下のコマンドを順に実行(コンフリクトなしの場合不要)
$ git add .
$ git rebase --continue
※途中でリベースを取り消す場合は以下のコマンドを実行(変更した内容も取り消される)
$ git rebase --abort
→ 変更の完了した分も元に戻ります。rebaseが完全に完了した場合は使えないので要注意。
(9) リモートリポジトリにプッシュ
# プッシュ前に親ブランチの変更内容が取り込まれていることを確認しておく
$ git log --oneline
# リモートリポジトリにプッシュ
$ git push -f
→ 親ブランチに追加された内容が作業ブランチの途中に割り込む形となるため、fオプションで強制的にプッシュします。
(10) 手順(2)でstashした場合は、忘れないうちに戻しておきましょう
# stash一覧の確認
$ git stash list
# 最新のstashを反映
$ git stash pop
注意点
- リベース前後で作業ブランチのコミットハッシュ値が変わる(イメージ図参照)。
- 原則、自身の作業ブランチ以外では実施しないこと。
終わりに
時々必要な作業で、そのたびに手間取るので、対策用にまとめました。