🐰

「やべ!間違ったuserでcommitしちゃった!」って時の対処法と再発防止策

2021/09/11に公開

はじめに

こんにちは, @kazuです.
この記事では, git を用いたチーム開発における,

  • 表題の通りのやらかしをしてしまった時の対処法
  • 僕なりの再発防止策

を書いていこうと思います.
(最近やらかしがちなので)

やらかしについて

状況

  • gitで作業中, 間違ったuserの情報(user.nameuser.email)でcommitしてしまった.
  • また, そのcommitをremote repositoryにpushしてしまった.

あるべき状況

  • 正しいuserの情報でcommitが作られる

対応方針

  1. localにて, 該当commitのuser情報を修正する.
  2. その後, repote branchに反映させるためにforce pushする.

備考(autheorcommiterについて)

今回間違ったuserの情報でcommitを作ってしまったわけですが, この情報がどこで使われているのかというと, そのcommitの

  • author
  • commiter

の2箇所で使われています.
この2つの違いですが, Pro Git bookによると,

authorとはその作業をもともと行った人、committerとはその作業を適用した人のことを指します。 あなたがとあるプロジェクトにパッチを送り、コアメンバーのだれかがそのパッチを適用したとしましょう。 この場合、両方がクレジットされます (あなたがauthor、コアメンバーがcommitterです)。

とあります.
つまり, 今回のようなlocalで自分が作業して自分でcommitした場合は, 共に自分の情報になります.

対処法

1. localにて, 該当commitのuser情報を修正する.

まずは, localでcommitのuser情報を修正します.

1.1 user情報の設定変更

その前に, 以下のように正しいuser情報に設定し直しておきます.

git config user.name "Correct Name"
git config user.email "correct@example.com"

1.2 修正したいcommitの確認

間違った情報で作ってしまったcommitを確認します.
以下のコマンドで, commiterauthorを出力することが出来ます.

git log --pretty=full

1.3 修正する

最後にcommitを書き換えていきます.
1.2で確認したcommitが入るように, git rebaseを実行します.

# HEADから4つ遡る
git rebase -i HEAD~4
# or ハッシュ指定
git rebase -i <commit-hash>

するとエディタが開くので, 修正したいcommitをpickからeditに変更しエディタを閉じると
標準出力に以下のようなメッセージが出ます.

You can amend the commit now,  with

        git commit --amend

Once you are satisfied with your changes,  run

        git rebase --continue

今回は, authorcommiterの情報を書き換えたいので, 以下のコマンドを実行します.

# 修正(エディターが開くが, そのまま保存して閉じる)
git commit --amend --reset-author
# このcommitに対する修正の終了
git rebase --continue

修正したいcommitが複数有る場合は上記の修正修正の終了を繰り返す.

2. repote branchに反映させるためにforce pushする.

localで修正した内容をremote repositoryに反映します.

git push -f

最後にremote repositoryに正しく反映されてるかブラウザなどで確認して終了です.

再発防止策

もうやらかしたくないので再発防止策を考えました.
本来であればremote repository側でcommiterの情報を基にpushをrejectするようなpolicyを設定すれば良いと思います.
しかし, 大人の事情もいろいろ有るので, 今回は個人で出来る対策として,

  • git管理のディレクトリにいる場合は, プロンプト上にuser.emailを常時表示する

という方針で行きます.
image
user.emailの常時表示(一番右にメールアドレスが表示されている)

実現方法

僕はzshstarshipを使っているので, 今回はstarshipのカスタムコマンドとして実現することにしました.

公式ドキュメンtによると,

  • command: 表示したい内容を出力するコマンド
  • when: いつ表示するかを制御するコマンド.このコマンドの返り値が0のとき表示される.
  • format: 表示方法

あたりを指定すれば良さそうです.
なので以下のような設定を~/.config/starship.tomlに追記しました.

[custom.gitmail]
command = "git config user.email"
when = "[ -d .git ] && echo .git || git rev-parse --git-dir > /dev/null 2>&1"
format = " | [$output](underline fg:blue) | "

このように設定することで, 上記のスクリーンショットのようにuser.emailが常時表示されます.

余談

余談ですが, ~/.config/starship.tomlはdotfilesで管理しているので, 環境を移行しても簡単に再現できます.
(前書いた記事ではpowerlevel10k使ってましたが乗り換えました.)
https://zenn.dev/k4zu/articles/zsh-tutorial

僕のstarship.tomlはこちら(全然カスタマイズしてませんが)
https://github.com/kazu914/dotfiles/blob/master/zsh/05_starship.toml

終わりに

何回やってもgit push -fは緊張しますね. (何回もするな)

Discussion