共有した履歴は書き換えない——force pushの前に思い出すこと
この記事はSESで働く人の話です。いまのあなたの現在地は、3分の自己診断で測れます。無料・登録不要です。
「force pushしたら、他の人のコミットが消えました」——常駐先のGit事故で、いちばん青ざめる報告のひとつです。
共有された履歴は、もう他人の手元にある
共有ブランチに対して rebase をしてはいけないのは、rebase がコミットを作り直す(IDが変わる)操作だからです。自分のローカルブランチなら整理されるだけですが、共有ブランチでやると、同じ変更が別のコミットとして二重に見え、他の人が pull した瞬間に食い違いが起きます。共有された履歴は、他人の手元にもう存在していることを忘れると事故になります。
消すのではなく、打ち消す
すでに push したコミットを取り消したいときも同じ発想です。書き換えて force push するのではなく、revert で打ち消すコミットを新しく積みます。これなら誰の手元とも矛盾しません。消すのではなく、消したという事実を歴史として残す、という考え方です。
どうしても force push が必要なら
どうしても force push が要る場面もあります。そのときは --force ではなく --force-with-lease を使います。--force は相手のコミットを問答無用で消しますが、--force-with-lease は「自分が最後に見た状態から変わっていなければ」という条件付きで、知らない間に誰かが push していたら失敗して止まります。人の記憶で気をつけるのではなく、機械に止めさせるという発想です。
事故ったときの態度が、次の信頼を分ける
万一事故が起きたときの振る舞いは、火事場で信頼される人が、静かにやっていることに近い話です。わかっていることとわかっていないことを分けて共有し、進捗を聞かれる前に出す。Gitの事故でも、この2つは同じように効きます。
共有履歴に関わる判断は、エンジニアの型の問題集にまとめてあります。
この記事は役に立ちましたか?