「やべ!間違ったuserでcommitしちゃった!」って時の対処法と再発防止策
はじめに
こんにちは, @kazuです.
この記事では, git
を用いたチーム開発における,
- 表題の通りのやらかしをしてしまった時の対処法
- 僕なりの再発防止策
を書いていこうと思います.
(最近やらかしがちなので)
やらかしについて
状況
- gitで作業中, 間違ったuserの情報(
user.name
とuser.email
)でcommitしてしまった. - また, そのcommitをremote repositoryにpushしてしまった.
あるべき状況
- 正しいuserの情報でcommitが作られる
対応方針
- localにて, 該当commitのuser情報を修正する.
- その後, repote branchに反映させるためにforce pushする.
autheor
とcommiter
について)
備考(今回間違った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を確認します.
以下のコマンドで, commiter
とauthor
を出力することが出来ます.
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
今回は, author
とcommiter
の情報を書き換えたいので, 以下のコマンドを実行します.
# 修正(エディターが開くが, そのまま保存して閉じる)
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
を常時表示する
という方針で行きます.
user.emailの常時表示(一番右にメールアドレスが表示されている)
実現方法
僕はzsh
でstarship
を使っているので, 今回は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
使ってましたが乗り換えました.)
僕のstarship.toml
はこちら(全然カスタマイズしてませんが)
終わりに
何回やってもgit push -f
は緊張しますね. (何回もするな)
Discussion