🕌

git rebaseと git merge の違いと、使い分け

2024/06/27に公開

はじめに

表題の2つのgit 操作を実務でよく使うのですが、それらの違いについてあまり理解できていなかったので調べてまとめてみます。

これらのコマンドを使うシーンとして、例えば、自分の手元で開発をする際にまずリモートのdevelop ブランチからブランチを切って作業をするのですが、少し時間が経ってしまったので最新のリモートのdevelopブランチを取り込みたい、といった時に使います。

こちらのサイトがとてもわかりやすかったので参考にさせていただきました。)

git merge について

git merge コマンドは、2つのブランチの履歴を結合するために使用されます。

例えば、自分のローカルで、コミットが先頭からA → B → Cと作業をしていたとして、リモートの develop ブランチを merge すると、A → B → C → D (Dがリモートのdevelopブランチ) という形でくっつきます。

具体的なコマンドの流れは次の通りです。

develop ブランチを最新にする

git switch develop // リモートの develop ブランチへアクセス
git pull origin develop // リモートの develop ブランチを手元のローカルの develop の追跡ブランチに持ってくる

作業ブランチに切り替える

git swith <branch名>

作業ブランチにマージする

git merge develop //  最新の develop ブランチがマージされる

リモートリポジトリの develop ブランチを直接マージする方法

上記は、一旦手元にdevelop ブランチを持ってきてマージしていますが、リモートから直接マージする方法もあります。

作業ブランチに切り替える

git swith <branch名>

作業ブランチに直接マージする

git merge origin/develop

git rebase について

git rebase コマンドは、作業ブランチのベースを変更して、リモートブランチの最新のコミットに基づいて再配置します。

例えば、自分のローカルで、コミットが先頭からA → B → Cと作業をしていたとして、リモートの develop ブランチをrebaseと、D → A → B → C (Dがリモートのdevelopブランチ) という形でくっつきます。

具体的なコマンドの流れは次の通りです。

develop ブランチを最新にする

git switch develop // リモートの develop ブランチへアクセス
git pull origin develop // リモートの develop ブランチを手元のローカルの develop の追跡ブランチに持ってくる

作業ブランチに切り替える

git swith <branch名>

作業ブランチに rebase する

git rebase develop

まとめ

  • merge
    • ブランチの履歴をそのまま残してマージコミットが作成される
  • rebase:
    • 作業ブランチのコミット履歴を再配置するので、マージコミットができずコミット履歴が綺麗になる
    • コミットを新しく作成する形になるので、コミット番号が変わる

履歴を綺麗に保ちたい場合は rebase、履歴をそのまま残したい場合は merge を使うのが良さそうです。

Discussion