皆さんこんにちは。
withでiOSエンジニアをしている @zrn-ns です。
皆さんは git rebase
コマンドを使ったことはありますか?
過去を改変する便利で強力なツールである git rebase
コマンドですが、これを使ったことがある人であれば誰しも一度はその力に溺れ、gitリポジトリを壊した経験をお持ちでしょう。
思い出してみてください。「あれ、自分のPRに関係ない別の人のコミットが混ざっている...」なんて経験、ないですか?
Gitリポジトリを壊してしまったとき、最初のうちはなぜ壊れたのか分からず混乱すると思います。
今回は僕の知っているGitのリポジトリの壊し方と、その防ぎ方を皆様にお伝えします。
注意
お気付きかと思いますが、この記事はGitリポジトリを破壊するためのものではなく、誤った操作を学び、同じ過ちを繰り返さないようにするためのものです
サンプル
分かりやすいよう、今回はコミット履歴のサンプルとして base
ブランチと、そこから派生した feature
ブランチを用意しました。
ここでbaseブランチに1コミット追加し、
その後 base
を feature
にマージする、という流れを考えます。
現状は特に問題なくマージができます。
コミット履歴の壊し方
基本的な考え方として、ベースブランチから派生ブランチを切って作業をする場合、 ベースブランチ側の履歴を改変すると、ベースブランチと派生ブランチの間で整合性が取れなくなり、コミット履歴が壊れます。
実際に履歴が壊れるパターンを2つ見てみましょう。
破壊パターン1. ベースブランチ上のコミットを変更する
feature
ブランチが切られた状態で base
ブランチの履歴を改変してしまうと、コミット履歴が壊れます。
base
ブランチをチェックアウトし、ブランチが分岐しているコミット 7c8da09
を git rebase -i
によって変更してみましょう。
すると、このように base
ブランチのコミット履歴が書き換わります。
改変したコミット 7c8da09
は無くなるのかと思いきや、しっかり feature
ブランチには残っています。
この状態で feature
ブランチに base
ブランチをマージしようとすると、 以前 base
ブランチに含まれていた 7c8da09
と、それを改変した 53dee4f
の両方が履歴に含まれた状態になります。
破壊パターン2. ベースブランチ上のコミットを削除
パターン1ではコミットを編集していましたが、コミットを削除した場合はよりわかりやすく履歴が壊れます。
base
ブランチ側でコミット 7c8da09
は削除したはずですが、マージしたときに意図せず復活してしまっています。
業務上よくある破壊手順
業務上よくあるパターンとして、以下のような手順を踏んでコミット履歴を壊すことが多いです。
- push済みの自分のfeatureブランチのコミット履歴を綺麗にするため、featureブランチで
git rebase -i
してforce-pushしたところ、自分のfeatureブランチから別のfeatureブランチを切っている人がおり、その人のブランチを壊してしまった - 自分のブランチにdevelopやmasterをマージしたあと、
git rebase -i
でマージコミットよりも前のコミットを変更してしまった(今回は詳しく解説しませんが、こちらが詳しいです)
深く考えずに履歴改変している方。気づかないうちに他のメンバーのコミット履歴を壊しているかもしれません。
コミット履歴破壊の予防策
以下のような点に気をつければ、コミット履歴の破壊を防ぐことができます。
-
main
やmaster
,develop
ブランチはGithub上で保護設定を行い、force-pushを行えないようにする- feature等のブランチについてforce-pushするにしても
--force-with-lease
オプションを付け、ブランチに対する他のメンバーによる変更に気づけるようにする
- feature等のブランチについてforce-pushするにしても
- リモートにpushした(他の人から参照可能になった)ブランチ上のコミット履歴は原則改変しない
- 他の人がpushしたfeatureブランチを取り込まない
- マージコミット後は、マージコミット以前のコミットは原則改変しない
チームにgitに不慣れなメンバーが多い場合は、一律でforce-pushを禁止してしまうというのも一つの手です。
最後に
コミットログを綺麗に保つには必須と言ってもいい rebase
による履歴改変ですが、不慣れなうちはコミット履歴を破壊しがちです。
自他のブランチのコミット履歴を破壊して迷惑をかけないよう、注意していきたいですね。
PR
withではエンジニアの採用を行っています。
興味があれば、ぜひお問い合わせください!