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した場合、
ブランチ同士の連携が取れなくなることがある
例)
- AブランチからBブランチをチェックアウト
- AブランチのCommit/Author情報を全て変更
- Aブランチを
push -f
- BブランチにAブランチをマージする
- 以下のメッセージが表示され、マージに失敗
git merge --no-ff <BranchA>
fatal: refusing to merge unrelated histories
その場合、--allow-unrelated-histories
オプションを駆使するか、
Bブランチも同じようにCommit/Author情報を全て変更してpush -f
すると
再度AブランチとBブランチの連携が取れるようになります
※正攻法ではないため、バックアップを取った上での対応をお願いします