LoginSignup
1
2

More than 5 years have passed since last update.

Commit履歴のAuthor情報、及びCommitter情報を更新する

Last updated at Posted at 2016-11-04

Gitで複数アカウントを使い分けていたら、
間違えてCommit -> Pushしてしまい
色々とヤバいことになってしまったので
今後同じような問題に直面した人用に修正方法をまとめておきます

基本的なCommitter設定の更新方法

特定のディレクトリでの設定更新

git config user.name <name>
git config user.email <email>

全体の設定更新

git config --global user.name <name>
git config --global user.email <email>

(今後のコミットのCommitter情報は上記で更新されるが、
 すでにコミット済みのモノの情報は変わらないので注意)

コミット済みのコミット情報を更新する

現状のブランチの全てのコミット情報を更新する場合

git filter-branch -f --env-filter '
GIT_AUTHOR_NAME='<name>';
GIT_AUTHOR_EMAIL='<email>';
GIT_COMMITTER_NAME='<name>';
GIT_COMMITTER_EMAIL='<email>'
' HEAD

現状のブランチの指定のコミット範囲のコミット情報を更新する
※以下の例では直近10コミット

git filter-branch -f --env-filter '
GIT_AUTHOR_NAME='<name>';
GIT_AUTHOR_EMAIL='<email>';
GIT_COMMITTER_NAME='<name>';
GIT_COMMITTER_EMAIL='<email>'
' HEAD~10...HEAD

特定の条件のコミットのみ書き換える

現状のブランチの全てのコミット情報を更新する場合

git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<oldName>" ];
then
GIT_AUTHOR_NAME="<newName>";
GIT_AUTHOR_EMAIL="<newEmail>";
GIT_COMMITTER_NAME="<newName>";
GIT_COMMITTER_EMAIL="<newEmail>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD

現状のブランチの指定のコミット範囲のコミット情報を更新する
※以下の例では直近10コミット

git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<oldName>" ];
then
GIT_AUTHOR_NAME="<newName>";
GIT_AUTHOR_EMAIL="<newEmail>";
GIT_COMMITTER_NAME="<newName>";
GIT_COMMITTER_EMAIL="<newEmail>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD~10..HEAD

仕様できる定数名に関しては、以下を参照
https://www.kernel.org/pub/software/scm/git/docs/git-commit-tree.html

更新したコミットを(強制的に)Pushする

すでにpush済みのコミットを変更した場合、
普通にpushしようとすると以下のようなメッセージで弾かれる

git push origin <branchName>
To <originUrl>
 ! [rejected]        <branchName> -> <branchName> (non-fast-forward)
error: failed to push some refs to '<originUrl>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

そのような場合、-fオプションをつけて強制的にpushする
-fオプションは乱用すると色々と大変な状態になるので、ご利用は計画的に

git push -f origin <branchName>

unrelated histories について

コミット情報を変更し、強制的にpushした場合、
ブランチ同士の連携が取れなくなることがある

例)
1. AブランチからBブランチをチェックアウト
2. AブランチのCommit/Author情報を全て変更
3. Aブランチをpush -f
4. BブランチにAブランチをマージする
5. 以下のメッセージが表示され、マージに失敗

git merge --no-ff <BranchA>
fatal: refusing to merge unrelated histories

その場合、--allow-unrelated-historiesオプションを駆使するか、
Bブランチも同じようにCommit/Author情報を全て変更してpush -fすると
再度AブランチとBブランチの連携が取れるようになります

※正攻法ではないため、バックアップを取った上での対応をお願いします

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2