はじめに
Gitの操作でpullはわかってもこのrebaseって何だ?みたいなことが
現場で発生しました。
この記事ではgit pullとgit pull -rebaseの違いについて説明していきます。
git pull --rebaseはどういう場面で使ったのか
自分が現場にアサインされた時にブランチのdevelopを切りfeatureブランチを作成した時に
このgit pull --rebaseを使用しました。
このようなアドバイスを先輩からもらいました。
developをpullする時は
$ git fetch
$ git pull --rebase origin develop
を使ってとアドバイスをいただきました。
これは余計なコミットを作らないためだそうです。
この記事を書いた理由
なんでこの--rebase
が使われるのかがわからなかったので、
先輩に記事を紹介してもらい下の参考資料から調べてみました。
するとgit fetch pull merge rebaseの違いをそれぞれ知る必要があると思いました。
前提知識
git pull --rebase
を理解するには、なんとfetch、merge、rebase の
3つの Git コマンドをちゃんと理解しなければいけません。
git fetch
リモート環境の最新情報をローカル環境に反映するコマンドです。
$ git fetch
$ git fetch origin master //リモートのmasterブランチからローカルのorigin/masterブランチへ反映
git merge
現在いるブランチの内容を他のブランチやmasterなどに反映させるコマンドです。
origin/masterからmasterへ最新情報を反映させます。
$ git merge master //masterブランチの内容を今いるブランチにマージしたい時
git rebase
mergeと同じで今いるブランチに別のブランチの情報を反映させるコマンドです。
そして以下のコマンドを使います。
$ git rebase master //今いるブランチを master にリベースしたい時
別のブランチにあるふたつのコミットを一時的に保存し別のブランチをリベース先のブランチに
git reset --hard(ブランチをmasterと同じ状態にする)
します。
リセット後の別のブランチの上に一時保存していたコミットを入れます。
git rebaseだどコミットを新しく作りなおすので、
リベース前とコミットのid と親のid が変わり、master の変更を取り入れ別物になります。
git mergeとrebaseの違い
git mergeは現在のブランチの別のブランチの情報を取り込みます。
git rebaseは取り込みたいブランチの上に今のブランチの内容を反映させます。
git pull
git mergeと git fetchを同時に行うコマンドです。
リモートのmasterブランチからローカルのmasterまで一気に最新情報を反映させます。
$ git fetch
$ git merge origin master
これを一括で反映させることができます。
$ git pull origin master
注意
先輩エンジニアから聞いたのですが、現場で使わない時もあるみたいです。
理由はもし他でエラーが起きていたら他の人のエラーの分まで取り込んでしまうみたいです。
(今自分が参画している現場ではpullは普通に使っています。)
基本エラーが起きている状態で反映されることの方が珍しいです。
git pull --rebase
--rebaseは git pullのオプションコマンド
みたいです。
git pullに --rebaseオプションをつけ、git fetch + rebase
として実行されます。
$ git pull --rebase origin master
上だと
$ git pull --rebase origin develop
ですね。
git pullとgit pull --rebaseの違い
上の先輩から言われたdevelopからブランチを切る時は
--rebase オプションをつけてプルしたほうがマージコミットが作られないし余計な履歴が
残らず綺麗になるからでした。
$ git pull --rebase origin develop
参考資料だと
$ git pull --rebase origin master
してからプルリクエスト出して欲しいとのことでした。
注意
--rabase
のやり方はいろいろ議論があるらしく(ログが綺麗になるけども履歴を書き換えるべきではない」)
などいきなりリベースをするとチームの規約に反する場合もあるみたいで、
チームやプロジェクトによって変わってくるみたいなので、メンバーやリーダーの人などに
相談するといいみたいです。
補足(git rebase --abort)
実行中のリベース操作を中止し、リベース前の状態に戻すコマンドです。
git rebase --abort
これによって
- リベース中に作成された一時的なコミットや変更はすべて削除。
- リベース操作前の状態に戻る。
- リベースの操作中に変更されたファイルは、元の状態に戻る。
ここはChatGPTを参照。
参考資料