チュートリアル3 コミットを書き換えよう!

6. rebase -i でコミットを修正する

このチュートリアルでは、あらかじめ履歴が準備されているローカルリポジトリを使用します。

こちらからダウンロードしてください。

stepup-tutorial/tutorial6ディレクトリに移動します。このリポジトリの履歴は次の図で表す状態になっています。
ここでは、「commitの説明を追加」で行った変更内容を修正します。

リポジトリの履歴

rebase -iを使って、まずは修正するコミットを選択します。

$ git rebase -i HEAD~~

テキストエディタが開いて、HEADからHEAD~~までのコミットが次のように表示されます。

pick 9a54fd4 commitの説明を追加
pick 0d4a808 pullの説明を追加

# Rebase 326fc9f..0d4a808 onto d286baa
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

1行目のpickの文字をeditに変更して保存・終了します。すると、次のような出力が表示されて、修正するコミットがチェックアウトされた状態になります。

Stopped at d286baa... commitの説明を追加
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

sample.txtを開いて、commitの説明の所を適当に変更してしてください。

サルでもわかるGitコマンド
add 変更をインデックスに登録する
commit インデックスの状態を記録する
pull リモートリポジトリの内容を取得する

commit --amendで変更を保存します。

$ git add sample.txt
$ git commit --amend

commitをしただけだとまだrebaseの作業は終わっていません。このコミットでの作業が終了したことを知らせるには、--continueオプションを指定してrebaseを実行します。

$ git rebase --continue

Note

この時、ほかのコミットで競合が発生することがあります。その時は、競合箇所を修正してからaddとrebase --continueを実行してください。このとき、コミットは必要ないので実行しないでください。
もし、途中でrebaseの作業を中止したくなった場合はrebaseに--abortオプションを指定して実行すると、これまでのrebaseでの作業をなかった事にして中止できます。

これで、コミットの修正が完了しました。 もし、複数のコミットをeditに変更していた場合、次に修正するコミットがチェックアウトされるので、今と同じように変更を行います。

Note

実は、rebase前のコミットはORIG_HEADという名前で残っています。
もし、rebaseした後で元に戻したくなった場合は git reset --hard ORIG_HEAD でrebase前の状態に戻せます。