Git Rebase vs Merge
最終更新
git merge と git rebase はどちらも、あるブランチの作業を別のブランチへ取り込みます。git merge は 2 つの履歴をマージコミットで結び付け、実際に起きたことをそのまま保持します。git rebase はあなたのコミットを 1 つずつ別のブランチの上に再適用し、きれいで直線的な履歴を作りますが、その過程でコミットを書き換えます。
黄金律: 他の人がすでに pull したコミットには決して rebase しないこと。両方をターミナルプレイグラウンドで試してみましょう — ブラウザ内の本物のシェルです。
並べて比較
| Behavior | git merge | git rebase |
|---|---|---|
| 履歴の形 | マージコミットを伴う分岐 | 直線的 |
| コミットを書き換える | いいえ | はい |
| 共有ブランチで安全 | はい | いいえ |
| 正確な履歴を保持する | はい | いいえ |
| 何がいつマージされたか追跡しやすい | はい | 難しい |
構文
| Command | What it does |
|---|---|
git merge feature | feature を現在のブランチにマージする |
git merge --no-ff feature | 常にマージコミットを作成する |
git rebase main | 現在のブランチのコミットを main の上に再適用する |
git rebase -i HEAD~3 | 直近 3 件のコミットを対話的に編集する |
git rebase --abort | 進行中の rebase を中止する |
Git rebase vs merge よくある質問
git rebase と git merge の違いは何ですか?
git merge は、2 つのブランチの履歴を結び付ける新しいマージコミットを作成して両者を統合し、何が起きたかの正確な記録を保ちます。一方 git rebase は、あなたのコミットを別のブランチの上に再適用されるように移動させ、一直線の履歴を作りますが、それらのコミットを新しいハッシュで書き換えます。merge は履歴を保持し、rebase はきれいにするために履歴を書き換えます。merge を使うべきときと rebase を使うべきときは?
完成したブランチ(特に共有されているもの)を統合するには merge を使いましょう — 安全で非破壊的です。共有する前に自分のローカルコミットを整理したり、フィーチャーブランチを最新の
main の上に更新してきれいな履歴にしたりするには rebase を使いましょう。多くのチームはローカルで rebase し、その後 main に merge します。rebase の黄金律とは何ですか?
他の人がすでに作業の土台にしているコミット — 通常は共有ブランチに push したものすべて — には決して rebase しないでください。rebase はコミットを書き換えるため、そうすると他の全員が分岐した履歴の調整を強いられます。ローカルで未 push のコミットには自由に rebase し、すでに公開されているものには merge(または revert)を使いましょう。
rebase と merge のどちらが競合が少ないですか?
どちらも競合を回避はしませんが、現れ方が異なります。merge はすべての競合をマージコミットで一度に解決します。rebase は各コミットが再適用されるにつれて、コミットごとに競合の解決を求めることがあります。作業量の合計は同程度で、rebase はそれを分散させるだけです。
これをオンラインで練習できますか?
はい。ターミナルプレイグラウンドを開けば、ブラウザ内の本物のシェルで
git merge と git rebase を実行できます — インストール不要です。Coddy の無料のインタラクティブな Git コースでも、マージと rebase を段階的に扱っています。