git メモ:コミット済みの電子メールの変更と履歴の復旧post

commit 時のメールアドレスが間違っていたのを気がついたので調べて直したのはしばらく前のこと。

リモートのレポジトリががっつり更新されていたのでじゃあマージしてみるか、と思ってマージしてみたら、、、

コンフリクトがドバッと出て大変なことになりました、をなんとか直したメモ。

メールアドレスを間違った!

$ git filter-branch --commit-filter '
        if [ "$GIT_AUTHOR_EMAIL" = "john.doe@localhost" ];
        then
                GIT_AUTHOR_NAME="John Doe";
                GIT_AUTHOR_EMAIL="john.doe@example.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

みたいな感じで治せます。

が、これをやると、一つ前のコミットはもちろんのこと最初のコミットまでドバッとハッシュが変わります。

なので、はい、大変なことになりました。

pull してみたところ!?

リモートの変更を取り込むために、 git pull してみたところ

$ git pull origin master
From git://source.winehq.org/git/wine
 * branch            master     -> FETCH_HEAD
Auto-merging tools/wrc/wrc.c
CONFLICT (add/add): Merge conflict in tools/wrc/wrc.c
Auto-merging tools/winemaker/winemaker.man.in
CONFLICT (add/add): Merge conflict in tools/winemaker/winemaker.man.in
               :

コンフリクトしました、、、、それは見事に。

そもそもの話、ブランチに直接マージするな、という話もなきにしもあらず、は置いておく。

なんとか復旧してみる

なんともならなかったので、ブランチを作り直してパッチを当てようと思ったけど、変更箇所のコミットのみを適用できるのであれば、その方がいいので探てみるとできそうだったのでやってみた。

やり方は、 master にリモートの変更を pull し、ブランチを作り、変更を適用。

$ git checkout master
$ git pull origin master
$ git checkout -b 新しいブランチ名
$ git cherry-pick 範囲の最初のハッシュ^..範囲の終わりのハッシュ

こんな感じ。

マージの確認

さて、どうやらまたリモートで変更があったようです。

実際にマージ作業の確認をしてみましょう。

$ git checkout master
$ git pull origin master
$ git checkout トピックブランチ名
$ git merge master
Auto-merging dlls/opengl32/wgl.c
Auto-merging dlls/opengl32/opengl_norm.c
               :

はい、問題なくマージできたようです。

参考


   /   変更履歴  /   Permalink  /  このエントリーをはてなブックマークに追加 
 カテゴリ: ブログ  /   タグ: git, メモ