LoginSignup
80
55

知っていたら実務で最強! git pullとgit pull --rebaseの違い

Last updated at Posted at 2022-03-04

はじめに

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と同じで今いるブランチに別のブランチの情報を反映させるコマンドです。

image.png

引用 https://kray.jp/blog/git-pull-rebase/

そして以下のコマンドを使います。

$ git rebase master  //今いるブランチを master にリベースしたい時

別のブランチにあるふたつのコミットを一時的に保存し別のブランチをリベース先のブランチに
git reset --hard(ブランチをmasterと同じ状態にする) します。

リセット後の別のブランチの上に一時保存していたコミットを入れます。

image.png

引用   https://kray.jp/blog/git-pull-rebase/

git rebaseだどコミットを新しく作りなおすので、
リベース前とコミットのid と親のid が変わり、master の変更を取り入れ別物になります

image.png

引用   https://kray.jp/blog/git-pull-rebase/

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

してからプルリクエスト出して欲しいとのことでした。

image.png

引用 https://kray.jp/blog/git-pull-rebase/

注意

--rabaseのやり方はいろいろ議論があるらしく(ログが綺麗になるけども履歴を書き換えるべきではない」)
などいきなりリベースをするとチームの規約に反する場合もあるみたいで、
チームやプロジェクトによって変わってくるみたいなので、メンバーやリーダーの人などに
相談するといいみたいです。

補足(git rebase --abort)

実行中のリベース操作を中止し、リベース前の状態に戻すコマンドです。

git rebase --abort

これによって

  1. リベース中に作成された一時的なコミットや変更はすべて削除
  2. リベース操作前の状態に戻る
  3. リベースの操作中に変更されたファイルは、元の状態に戻る

ここはChatGPTを参照。

参考資料

80
55
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
80
55