🕌
git rebaseと git merge の違いと、使い分け
はじめに
表題の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