gitでは様々な方法でコミットログを書き換えることができます。 その一例として誤ったブランチに対して行った変更を正しいブランチへ移す方法を紹介します。
問題
これまで「新機能Xを追加する」という設定で以下のトピックについて解説していました:
これにはまず
$ git branch topic-x master
$ git checkout topic-x
としてこの作業用のトピックブランチを作成してそちらで作業を行うのが普通です。
しかし git branch を実行したところで安心してしまい、
git checkout を忘れて全く違うブランチで作業を行ってしまう
というミスは時々やってしまいます
(git checkout -b という方法もありますがここではそれも忘れていたとしましょう)。
例えば以下のような状況だったとしましょう:
$ git branch
master
topic-x
* topic-y
$ git log --oneline --decorate --graph
* c000022 (HEAD, topic-y) Update to use X
* c000012 Refactor - Sort using statements
* b000001 Add a neat feature X into the library
* 0100002 Update to use Y
* 0100001 Add a great feature Y in to the library
* 0000000 (master, topic-x) Initial import
日本語に訳すと以下の通りです:
- 新機能Yを追加するためのトピックブランチtopic-yをmasterから作成し、そこで作業を行った。 この時点でmasterは0000000を、topic-yは0100002を指していた。
- 新機能Xを追加するためのトピックブランチtopic-xをmasterから作成したが、 ブランチの切り替えを忘れていたため、 topic-xに対して行う変更をtopic-y上で行ってしまった。 結果としてtopic-yは0100002からc000022を指すようになった。
本来ならば以下のような形なっているところです:
$ git branch
master
* topic-x
topic-y
$ git log --oneline --decorate --graph master topic-x topic-y
* d000022 (HEAD, topic-x) Update to use X
* d000012 Refactor - Sort using statements
* d000001 Add a neat feature X into the library
| * 0100002 (topic-y) Update to use Y
| * 0100001 Add a great feature Y in to the library
|/
* 0000000 (master) Initial import
まだまだtopic-xの作業内容はどこにも公開されていないので、 いまのうちにコミットログを綺麗な形に書き換えるとしましょう。 しかし具体的にはどうすればよいでしょうか。

