コミット履歴を改変する (git rebase コマンド)
※ 一般的に共有のリポジトリ/ブランチでリベースを行うことは非推奨とされる。(他のユーザーがリベース前のコミットにアクセスできなくなるため)
コミットの履歴を確認する。
$ git log --oneline
改変したいコミットの一つ前を指定してインタラクティブなリベースを開始する。(@~
を編集したい場合は @~2
を指定する。)
$ git rebase -i @~2
テキストエディタ (デフォルトでは vi) が起動するので、pick
となっている項を適宜編集する。(コミットを編集 → edit
、前のコミットに統合 → squash
、コミットメッセージを編集 → reword
)また、コミットの並べ替えも必要に応じて可能である。
コミットの編集 (edit
) を指定した場合は、対象のコミットが完了した直後の状態に チェックアウトされているので、ファイルの編集とステージング (git add
) を行なって、 上書きコミット (git commit --amend
) を実行する。
$ git commit --amend
リベースを中止する場合は git rebase --abort
、次に進める場合は git rebase --continue
を実行する。
$ git rebase --continue
途中でコンフリクトが発生した場合は、コンフリクトしたファイルを修正・追加 (git add
)・削除 (git rm
) して、git rebase --continue
を実行する。
リベースが完了したら git push -f
でリモートに反映させる。
$ git push -f
参考:
git のコミットの歴史を改変する (git rebase) 1 / 2 | けんごのお屋敷
git のコミットの歴史を改変する (git rebase) 2 / 2 | けんごのお屋敷
インタラクティブモードで、todo リストを再編集してリベースを続行する | kledgeb
git-rebase Documentation | Git [Official]
How can I squash commits without tracking a remote branch? – Stack Overflow
メリット/デメリット
参考:
なぜ git rebase をやめるべきか | Frasco
最初のコミットを修正する
$ git rebase -i --root
参考:
Git の歴史修正、first commit すら書き換える – Qiita
First commit が git rebase -i できない問題 → git rebase -i --root でできる | 納豆には卵を入れる派です。
インタラクティブリベース中に todo リストを確認する
cat .git/rebase-merge/git-rebase-todo \ | git stripspace --strip-comments
参考:
Show number of TODO items for interactive rebase · git/git@97f05f4 – GitHub
Show list of commits during interactive rebase – Stack Overflow
REBASE_HEAD
参考:
git error message: rebase_head does not exist – Stack Overflow
--onto オプション
参考:
git rebase --onto を使って、まずは自分だけ幸せになる – Qiita
git rebase --onto どこへ どこから どのブランチを – Qiita
Git rebase --onto --root で過去の歴史を改変する | なんとな~くしあわせ?の日記
master HEAD 以降をインタラクティブに rebase する
共通の祖先コミットを調べる。
$ git merge-base master HEAD
共通の祖先コミット以降をリベースする。
$ git rebase -i $(git merge-base master HEAD)
参考:
簡単にトピックブランチだけで interactive rebase する – Qiita
コミットをまとめる (sqush)
参考:
Git で push 済の commit を sqush でまとめる方法 – Qiita
履歴の途中にコミットを追加する
参考:
How to inject a commit between some two arbitrary commits in the past? – Stack Overflow
ソースコード
参考:
git/rebase.c at v2.20.1 · git/git – GitHub