GitHubのコミット履歴で user1 committed with user2と表示される理由

GitHubのコミット履歴で user1 committed with user2と表示されることがあります。その理由と修正方法を紹介します。

GitHubのコミット履歴で通常は、

user1 committed 28 minutes ago

などと表示されますが、

user1 committed with user2 28 minutes ago

などと二人の名前が表示されることがあります。

これは、authorとcommitterが異なる場合にこのように表示されます。

 

この場合、user1がauthorで、user2がcommitterになっています。

これは、rebase や cherry-picking をした場合に起こります。

例えば、元々user1が作成しcommitしていたcommitを、user2がrebaseすると、user2がそのファイルのcommitterに変わります。

 

authorとcommitter名をコンソールで確認するには、

git cat-file -p HEAD

とか

git cat-file -p 9e84

などとします。-pの後には調べたいcommitをハッシュなどで指定します。なお、

git log --oneline

とすると、ハッシュを調べることが出来ます。

すると、次のようにauthorとcommitter名が表示されます。

tree 8277c3da1712cf117d16bad4c1ec988acb81c062
author user1 <user1@foobar.com> 1494421247 +0900
committer user2 <user2@foobar.com> 1494421247 +0900

first commit

 

これを履歴を残さず修正したい場合は、

git filter-branch

を使いますが、gitは履歴を残すためのシステムですので、それに反する悪のコマンドです。使うと怒られる場合があります。

次のようにすると、committer名がuser2であるコミットについて、committer名 をuser1に書き換えます。

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "user2" ];
        then
                GIT_COMMITTER_NAME="user1";
                GIT_AUTHOR_NAME="user1";
                GIT_COMMITTER_EMAIL="user1@foobar.com";
                GIT_AUTHOR_EMAIL="user1@foobar.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

今回authorは変更しないので、then以降のGIT_AUTHOR_NAMEとGIT_AUTHOR_EMAILは書かなくても良いです。authorも他のユーザに書き換えたいときには、ここも変更します。

そして、git push -fでリモートを書き換えます。

 

以上、GitHubのコミット履歴で user1 committed with user2と表示される理由でした。

参考

http://stackoverflow.com/questions/37245303/what-does-usera-committed-with-userb-13-days-ago-on-github-mean