ねこ元帥の中の人@リウマチ

日々の覚書など。ブログ名はオンラインゲームのアカウント名をいつも「ねこ元帥」にしているから。そして、2013年11月リウマチと診断されたとです。(2012年11月から時々手足に原因不明の痛みが発生、2013年9月以降は足の痛みが常態化、2013年12月30日からMTX服用開始、4月過ぎるころにはわずかの痛みが残る程度まで回復して現在に至る。)

gitリポジトリのコミットの修正をやってみた

user.nameを変更して、しばらくしてから元に戻したけど、その間のコミットに名前が残っているのを修正するため、コミット履歴の修正をやってみた。

修正前の状態確認

本作業の目的は以下の二つ。

  • コミットログの「TAKAMATSU Makoto」を「Takamatsu Makoto」に変更する。
  • user.nameの変更を削除する。


修正前のコミットログを確認する。

$ git log --pretty="format:%ad %h (%an): %s" --date=short
2013-09-07 ba85118 (TAKAMATSU Makoto): eclipse/pleiades起動関数定義位置変更と処理修正
2013-09-07 5e4936f (TAKAMATSU Makoto): 誤記修正
2013-01-26 28605ab (Takamatsu Makoto): 自宅用設定
2013-09-02 fe397df (TAKAMATSU Makoto): merge --no-ff設定、コメント修正
2013-08-31 c8ebefb (Takamatsu Makoto): 位置変更と空行追加
2013-08-31 dd36049 (Takamatsu Makoto): pull --rebase設定、マージツール設定

user.nameを変更したコミットを確認する。

$ git show fe397df
commit fe397dff8f543d3475a66994d086544807872310
Author: TAKAMATSU Makoto <******@***.**.**>
Date:   Mon Sep 2 08:15:14 2013 +0900

    merge --no-ff設定、コメント修正

diff --git a/.gitconfig b/.gitconfig
index bb47302..09b1fd4 100644
--- a/.gitconfig
+++ b/.gitconfig
@@ -1,5 +1,5 @@
 [user]
-       name = Takamatsu Makoto
+       name = TAKAMATSU Makoto
        email = ******@***.**.**

 [core]
@@ -28,9 +28,10 @@
        default = upstream       # defaultのpush先はtrackingしているリポジトリ

 [pull]
-       rebase = true            # pullするときはrebaseする
+       rebase = true            # git pull --rebase

 [merge]
+       ff = false               # git merge --no-ff
        tool = winmerge

 [mergetool "winmerge"]

コミットの修正開始

git rebase -iでコミットログの修正を開始する。

$ git rebase -i fe397df~

エディタが開いて以下の内容が表示されるので、ここで修正対象のコミットを指定する。

pick fe397df merge --no-ff設定、コメント修正
pick 28605ab 自宅用設定
pick 5e4936f 誤記修正
pick ba85118 eclipse/pleiades起動関数定義位置変更と処理修正

修正対象のコミットのpickをeditに変更してファイルを保存する。

edit fe397df merge --no-ff設定、コメント修正
pick 28605ab 自宅用設定
edit 5e4936f 誤記修正
edit ba85118 eclipse/pleiades起動関数定義位置変更と処理修正

コミットの修正(1/4)

以下のメッセージが表示されてrebaseが中断される。

Stopped at fe397df... merge --no-ff設定、コメント修正
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

このコミットでuser.nameを修正しているので、まずはこれを元に戻す。

$ vi .gitconfig
    name = TAKAMATSU Makoto
              ↓
    name = Takamatsu Makoto

修正内容をインデックスに追加。

$ git add .gitconig

修正内容をコミットしてrebaseを継続する。コミットログの名前の変更は--authorを指定する必要あり。(参考:Gitポケットリファレンス)

$ git commit --amend --author="Takamatsu Makoto <******@***.**.**>"
$ git rebase --continue

コミットの修正(2/4)

edit指定していない箇所はgitで自動処理されるので操作なし。

コミットの修正(3/4)

Stopped at 5e4936f... 誤記修正
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

ファイル修正は無しで、author指定してコミットするだけ。

$ git commit --amend --author="Takamatsu Makoto <******@***.**.**>"
$ git rebase --continue

コミットの修正(4/4)

Stopped at ba85118... eclipse/pleiades起動関数定義位置変更と処理修正
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

(3/4)と同じくファイル修正は無しで、author指定してコミットするだけ。

$ git commit --amend --author="Takamatsu Makoto <******@***.**.**>"
$ git rebase --continue

修正後の状態確認

修正後のコミットログを確認する。

$ git log --pretty="format:%ad %h (%an): %s" --date=short
2013-09-07 02f3b49 (Takamatsu Makoto): eclipse/pleiades起動関数定義位置変更と処理修正
2013-09-07 5006c73 (Takamatsu Makoto): 誤記修正
2013-01-26 c46dac2 (Takamatsu Makoto): 自宅用設定
2013-09-02 9e6f070 (Takamatsu Makoto): merge --no-ff設定、コメント修正

コミットログの名前の変更はできている。

user.nameの変更が無いことを確認する。

$ git show 9e6f070
commit 9e6f070a0a932830db90e97013f9c907647c4ed9
Author: Takamatsu Makoto <******@***.**.**>
Date:   Mon Sep 2 08:15:14 2013 +0900

    merge --no-ff設定、コメント修正

diff --git a/.gitconfig b/.gitconfig
index bb47302..7bd7411 100644
--- a/.gitconfig
+++ b/.gitconfig
@@ -28,9 +28,10 @@
        default = upstream       # defaultのpush先はtrackingしているリポジトリ

 [pull]
-       rebase = true            # pullするときはrebaseする
+       rebase = true            # git pull --rebase

 [merge]
+       ff = false               # git merge --no-ff
        tool = winmerge

 [mergetool "winmerge"]

user.nameの変更もなくなっている。


ここまでの作業はhomeブランチで行ったもので、次に修正結果をmasterブランチに反映する。
現時点でのコミットツリーの状態は以下のようになっている。

$ git log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'
*       02f3b49 Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (HEAD, home)
*       5006c73 Takamatsu Makoto        誤記修正
*       c46dac2 Takamatsu Makoto        自宅用設定
*       9e6f070 Takamatsu Makoto        merge --no-ff設定、コメント修正
| *     fe397df TAKAMATSU Makoto        merge --no-ff設定、コメント修正  (origin/master, master)
|/
*       c8ebefb Takamatsu Makoto        位置変更と空行追加
*       dd36049 Takamatsu Makoto        pull --rebase設定、マージツール設定

コミットログ修正をmasterに反映

masterブランチからfe397dfを削除できれば簡単だがコミットの削除はできないので、ひとつ前のコミットに戻してからhomeブランチの修正コミットを反映する。(追記:この文章を見直していて git reset --hard 9e6f070 のほうが良かったのではないかと思った。)

$ git checkout master
$ git reset --hard HEAD~
git log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'

*       02f3b49 Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (home)
*       5006c73 Takamatsu Makoto        誤記修正
*       c46dac2 Takamatsu Makoto        自宅用設定
*       9e6f070 Takamatsu Makoto        merge --no-ff設定、コメント修正
| *     fe397df TAKAMATSU Makoto        merge --no-ff設定、コメント修正  (origin/master)
|/
*       c8ebefb Takamatsu Makoto        位置変更と空行追加  (HEAD, master)
*       dd36049 Takamatsu Makoto        pull --rebase設定、マージツール設定

homeブランチから自宅用設定以外のコミットをマージする。

$ git cherrypick 9e6f070
$ git cherrypick 5006c73
$ git cherrypick 02f3b49
$ git log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'
*       73bccde Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (HEAD, master)
*       dac6eb1 Takamatsu Makoto        誤記修正
*       dc874f6 Takamatsu Makoto        merge --no-ff設定、コメント修正
| *     02f3b49 Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (home)
| *     5006c73 Takamatsu Makoto        誤記修正
| *     c46dac2 Takamatsu Makoto        自宅用設定
| *     9e6f070 Takamatsu Makoto        merge --no-ff設定、コメント修正
|/
| *     fe397df TAKAMATSU Makoto        merge --no-ff設定、コメント修正  (origin/master)
|/
*       c8ebefb Takamatsu Makoto        位置変更と空行追加
*       dd36049 Takamatsu Makoto        pull --rebase設定、マージツール設定

コミットログ修正をリモートリポジトリに反映

$ git push -f
$ git log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'
*       73bccde Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (HEAD, origin/master, master)
*       dac6eb1 Takamatsu Makoto        誤記修正
*       dc874f6 Takamatsu Makoto        merge --no-ff設定、コメント修正
| *     02f3b49 Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (home)
| *     5006c73 Takamatsu Makoto        誤記修正
| *     c46dac2 Takamatsu Makoto        自宅用設定
| *     9e6f070 Takamatsu Makoto        merge --no-ff設定、コメント修正
|/
*       c8ebefb Takamatsu Makoto        位置変更と空行追加
*       dd36049 Takamatsu Makoto        pull --rebase設定、マージツール設定

最後

masterブランチとhomeブランチで同じ内容のコミットが重複しているので整理しておく。

$ git checkout home
$ git rebase master
$ git log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'
*       7e04896 Takamatsu Makoto        自宅用設定  (HEAD, home)
*       73bccde Takamatsu Makoto        eclipse/pleiades起動関数定義位置変更と処理修正  (master, origin/master)
*       dac6eb1 Takamatsu Makoto        誤記修正
*       dc874f6 Takamatsu Makoto        merge --no-ff設定、コメント修正
*       c8ebefb Takamatsu Makoto        位置変更と空行追加
*       dd36049 Takamatsu Makoto        pull --rebase設定、マージツール設定


Gitポケットリファレンス

Gitポケットリファレンス