コミット履歴を改変する (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 rebase についてまとめてみた – Qiita

歴史の書き換え | Pro Git Book [公式]

git のコミットの歴史を改変する (git rebase) 1 / 2 | けんごのお屋敷

git のコミットの歴史を改変する (git rebase) 2 / 2 | けんごのお屋敷

git の commit をまとめる – Qiita

git でコミットの順序を入れ替える | TIM Labs

コミット履歴の順番を変えたい | すたらブログ

インタラクティブモードで、todo リストを再編集してリベースを続行する | kledgeb

リベース | Pro Git Book [公式]

git-rebase Documentation | Git [Official]

How can I squash commits without tracking a remote branch? – Stack Overflow

How do I use Git’s interactive rebase with a local-only repository (no remote / origin)? – Stack Overflow

メリット/デメリット

参考:

なぜ git rebase をやめるべきか | Frasco

最初のコミットを修正する

$ git rebase -i --root

参考:

git で最初のコミットを修正 | 開発メモ

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

Git: In an (interactive) rebase, find out which commit you are currently working on (until version < 1.7.9.5) | makandra dev

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 --onto の使い時 – Qiita

実践 git rebase --onto | あらびき日記

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

ソースコード

参考:

git/rebase.c at v2.20.1 · git/git – GitHub

git/rebase–interactive.c at v2.20.1 · git/git – GitHub

git/git-legacy-rebase.sh at v2.20.1 · git/git – GitHub

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です