Tech Hotoke Blog

IT観音とは私のことです。

【Git】プルリクエストに含まれる不要なコミットを削除する

f:id:TechHotoke:20220315115551p:plain

目的

Gitをなんとなく使わないようにするために、操作で詰まったこと、やりたいことの対処方法をまとめて、それらを深堀して理解を深めること

前提

  • Gitがインストールされていること
  • GitHubのアカウントが存在すること
  • GitHubリポジトリが存在すること
  • ITパスポートレベルのネットワークの用語などが分かること

やりたいこと

  • Pull Requestを出した後に、不要なコミットコミットログから削除したい

対応

  1. ローカルで該当のブランチに移動
  2. git rebase -i HEAD~(~はさかのぼりたいコミットの数分入力するまたは、~<さかのぼりたいコミットの数字>の書式でも可)
  3. 参考1のようにログが出てきます(5個のログをさかのぼる場合)
  4. 消したいcommitを行ごと消して保存(他のブランチで必要なコミットである場合は、必ずそちらのブランチにコミットログが存在することを確認してから実行してください)
  5. git push -f を実行して完了
参考1
pick eafa87e Remove hogehoge
pick e4ff1a5 Kick out hogehoge
pick 1e5f766 Remove fuga
pick e90e305 Fix design for hogehoge
pick fc1c368 Work in progress

【 20220318 追記】

ご指摘頂いたため追記しました。

  • PR内で「変なコミットが入っていますが、間違いなので無視してください」と自分でコメントしておくのが一番いい

コミットログは一種の「歴史」です。「不要なコミットを取り除きたい」ということは、「歴史を改竄したい」ということに等しいです。

PRに混入している「不要なコミットコミットログ」の程度にもよりますが、「ごめんね」で許されそうな軽微なものであればコメントを書いておわり、で十分だと思います。僕自身も業務でたまにそういう運用をしています。

  • レビュアーが困惑するぐらいひどい状況であれば、もう一度新しいブランチを作って、そこでコードを書き直してPRを再作成する方がいい

rebaseについて

基本構文

git rebase BaseBranch

に、現在いるブランチでおこなった全てのコミットを適用します。

挙動

  1. 現在のブランチ(D,E,Jコミット)でおこなわれた変更を一時的に保存
  2. 移行先のブランチ(master)にリセットする(git reset --hard master)
  3. 1で一時的に保存したコミットを順番に適用していく(親が違うので、コミットIDも変わる)

  4. 参考: 初心者でもわかる!リベースの使い方を解説します | 株式会社LIG

-iオプションについて

  • rebase --interactiveと同義
  • リベースのinteractiveモード
  • 今回は下記の接頭辞は修正していないが、これらを書き換えることでコミットメッセージの変更(一つ前のコミットメッセージの変更ならば、git commit --amendでいけます)などを行う事が可能
pick:コミットを採用
reword:コミットを採用するがコミットメッセージを変更
edit:コミットを採用するがファイルを修正する
squash:一個前のコミットと合体させる
fixup:コミットメッセージを変更しない点以外squashと同じ
exec:shellでコマンドを実行する

rebaseを使う時の注意点

  • 他人のコミットを決してリベースしてはいけない
    • 複数人での作業の場合、リモートにあるレポジトリを無理矢理リベースしたら、全く同じコミットが重複する可能性大
    • 新規コミットを作っているので、当然コミットIDも変わります。したがって、他の開発者のローカルにあるコミットをリベースしちゃうと、コミットIDが変わり、すでに存在している同じコミットと区別がつかなくなり、重複してしまうからNGです

rebaseを取り消したい時は、、、

git reflogで操作歴を見て、戻したいポイントを見つけたらgit reset --hard


今回はここまでです!

お付き合いいただきありがとうございます!!