LoginSignup
1
1

【Git】簡単!コミット履歴の壊し方💥🤛【やめろ】

Last updated at Posted at 2023-09-04

皆さんこんにちは。
withでiOSエンジニアをしている @zrn-ns です。

皆さんは git rebase コマンドを使ったことはありますか?

過去を改変する便利で強力なツールである git rebase コマンドですが、これを使ったことがある人であれば誰しも一度はその力に溺れ、gitリポジトリを壊した経験をお持ちでしょう

思い出してみてください。「あれ、自分のPRに関係ない別の人のコミットが混ざっている...」なんて経験、ないですか?

Gitリポジトリを壊してしまったとき、最初のうちはなぜ壊れたのか分からず混乱すると思います。

今回は僕の知っているGitのリポジトリの壊し方と、その防ぎ方を皆様にお伝えします。

注意
お気付きかと思いますが、この記事はGitリポジトリを破壊するためのものではなく、誤った操作を学び、同じ過ちを繰り返さないようにするためのものです

サンプル

分かりやすいよう、今回はコミット履歴のサンプルとして base ブランチと、そこから派生した feature ブランチを用意しました。
Untitled (8).png
ここでbaseブランチに1コミット追加し、
Untitled.png
その後 basefeature にマージする、という流れを考えます。
現状は特に問題なくマージができます。
Untitled (1).png

コミット履歴の壊し方

基本的な考え方として、ベースブランチから派生ブランチを切って作業をする場合、 ベースブランチ側の履歴を改変すると、ベースブランチと派生ブランチの間で整合性が取れなくなり、コミット履歴が壊れます

実際に履歴が壊れるパターンを2つ見てみましょう。

破壊パターン1. ベースブランチ上のコミットを変更する

feature ブランチが切られた状態で base ブランチの履歴を改変してしまうと、コミット履歴が壊れます。

base ブランチをチェックアウトし、ブランチが分岐しているコミット 7c8da09git rebase -i によって変更してみましょう。

Untitled (2).png
すると、このように base ブランチのコミット履歴が書き換わります。
Untitled (3).png
改変したコミット 7c8da09 は無くなるのかと思いきや、しっかり feature ブランチには残っています。

この状態で feature ブランチに base ブランチをマージしようとすると、 以前 base ブランチに含まれていた 7c8da09 と、それを改変した 53dee4f の両方が履歴に含まれた状態になります。
Untitled (4).png

破壊パターン2. ベースブランチ上のコミットを削除

パターン1ではコミットを編集していましたが、コミットを削除した場合はよりわかりやすく履歴が壊れます。
Untitled (5).png
Untitled (6).png
Untitled (7).png
base ブランチ側でコミット 7c8da09 は削除したはずですが、マージしたときに意図せず復活してしまっています。

業務上よくある破壊手順

業務上よくあるパターンとして、以下のような手順を踏んでコミット履歴を壊すことが多いです。

  • push済みの自分のfeatureブランチのコミット履歴を綺麗にするため、featureブランチで git rebase -i してforce-pushしたところ、自分のfeatureブランチから別のfeatureブランチを切っている人がおり、その人のブランチを壊してしまった
  • 自分のブランチにdevelopやmasterをマージしたあと、 git rebase -i でマージコミットよりも前のコミットを変更してしまった(今回は詳しく解説しませんが、こちらが詳しいです)

深く考えずに履歴改変している方。気づかないうちに他のメンバーのコミット履歴を壊しているかもしれません。

コミット履歴破壊の予防策

以下のような点に気をつければ、コミット履歴の破壊を防ぐことができます。

  • mainmaster, develop ブランチはGithub上で保護設定を行い、force-pushを行えないようにする
    • feature等のブランチについてforce-pushするにしても --force-with-lease オプションを付け、ブランチに対する他のメンバーによる変更に気づけるようにする
  • リモートにpushした(他の人から参照可能になった)ブランチ上のコミット履歴は原則改変しない
  • 他の人がpushしたfeatureブランチを取り込まない
  • マージコミット後は、マージコミット以前のコミットは原則改変しない

チームにgitに不慣れなメンバーが多い場合は、一律でforce-pushを禁止してしまうというのも一つの手です。

最後に

コミットログを綺麗に保つには必須と言ってもいい rebase による履歴改変ですが、不慣れなうちはコミット履歴を破壊しがちです。
自他のブランチのコミット履歴を破壊して迷惑をかけないよう、注意していきたいですね。

PR

withではエンジニアの採用を行っています。
興味があれば、ぜひお問い合わせください!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1