本文へスキップ
BecomeCoder

Gitコース · 第3章 履歴を整える · レッスン16

git rebase ― 履歴を一直線に積み直す

ブラウザで完結

導入

merge は2つの枝を合流させ、その合流点に マージコミット を残します。一方 rebase は、自分のブランチのコミットを 相手の先端に積み直して、履歴を枝分かれのない 一直線 にします。読みやすい履歴を保ちたいチームでよく使われます。

説明

mainfeature を別々のファイルで進めて、枝分かれを作ります。

git init
git add .
git commit -m "C1"
git switch -c feature
echo "機能の実装" >> app.js
git add app.js
git commit -m "Add feature"
git switch main
echo "説明を追記" >> README.md
git add README.md
git commit -m "Update README"
git switch feature
git log --oneline

いま履歴は C1 から二股に分かれています(feature には Update README が見えません)。

flowchart LR
    C1["C1"] --> U["Update README (main)"]
    C1 --> F["Add feature (feature)"]

ここで feature にいるまま git rebase main を打つと、Gitfeature のコミット(Add feature)を いったん外し、main の先端に付け替えて 積み直します。

git rebase main
git log --oneline

C1 → Update README → Add feature一直線 になりました。マージコミットは作られません。

flowchart LR
    C1["C1"] --> U["Update README (main)"] --> F2["Add feature (feature)"]

rebase の黄金律:すでに push して他人と共有しているコミットは rebase しないこと。rebase はコミットを作り直す(=別物に置き換える)ので、共有済みの履歴を積み直すと、みんなの履歴と食い違って混乱します。手元だけの・まだ共有していない ブランチを整えるときに使うのが基本です。

やってみよう

上の手順で枝分かれを作り、git log --onelinefeatureUpdate README が無いことを確認してから git rebase main を実行しましょう。もう一度 git log --oneline を見て、履歴が一直線につながり、マージコミットが無いことを確かめてください。

演習

feature ブランチにいる状態で、main の先端の上に積み直してください。

ヒント1を見る

今のブランチを別の土台に積み直すのは git rebase <土台のブランチ> です。

ヒント2を見る

git rebase main

実際に動かしてみよう

下の端末に git コマンドを打って Enter を押すと、その場で結果が返ります。本文の手順を実際になぞりながら進めましょう(各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」でいつでも戻せます)。

Git(シミュレート)

ブラウザ内でGitコマンドを試せる学習用環境を読み込みます(本物のgitではなく、動きを再現したものです)。
スクロールして表示された時点でも自動で読み込まれます。