gitでローカルにて「〇〇日の終わり」「一旦コミット」や「チェックアウトするから一旦コミット」(←stashを使うべき)等で変なタイミング、細かすぎるタイミングでコミットしてしまった場合にプルリク等を出すのに問題がある場合、
git rebaseで複数のコミットを一つにまとめられる。
例としてLaravelのルーティングファイルで下記のように3世代の変更があったとする。
web.php
<?php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
↓
<?php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
// 認証系ルーティング
Auth::routes();
↓
<?php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
// 認証系ルーティング
Auth::routes();
// ログイン後、本一覧画面へリダイレクト
Route::get('/home', function () {
return redirect('/MyBook/book');
});
現状を確認すると
# git log
commit 938982e0aa548d377559de969248b7460b6fdb61
Date: Sat Apr 13 16:35:49 2024 +0900
[コミット3]/homeのルーティング追加
commit f09cb6426b1b23b91191d3f2d2c58ac5ad325ae0
Date: Sat Apr 13 16:34:26 2024 +0900
[コミット2]認証ルーティング設定
commit 5a79aaf9a1556f2e168218af5dad90631a576ecc
Date: Sat Apr 13 16:33:08 2024 +0900
[コミット1]依存関係設定
この状態で例えばコミット2とコミット3を圧縮したい場合
git rebase -i HEAD~2
を実行
git rebase -i HEAD~Nの
Nは「HEAD(最新コミット)からいくつ前のコミットからrebaseの対象にしたいか)」
下記のような編集画面になるので
pick f09cb64 [コミット2]認証ルーティング設定
pick 938982e [コミット3]/homeのルーティング追加
# Rebase 5a79aaf..938982e onto 5a79aaf
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
対象のコミットのうち最古のもの以外をpickから「squash」に変更。ここでの操作はvim
pick f09cb64 [コミット2]認証ルーティング設定
squash 938982e [コミット3]/homeのルーティング追加
次に統合版のコミットメッセージの入力プロンプトの画面になるので編集
# This is a combination of 2 commits.
# The first commit's message is:
[コミット2]認証ルーティング設定
# This is the 2nd commit message:
[コミット3]/homeのルーティング追加
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# HEAD detached at f09cb64
# You are currently editing a commit during a rebase.
#
# Changes to be committed:
# (use "git reset HEAD^1 <file>..." to unstage)
#
# modified: web.php
↓
[ルーティング編集作業]認証と一覧画面のルーティングを設定
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# HEAD detached from f09cb64
# Changes to be committed:
# (use "git reset HEAD^1 <file>..." to unstage)
#
# modified: web.php
#
最後に確認すると
# git log
commit 12f2f8cb9bba537a1546bb465e3c543c319f35c9
Date: Sat Apr 13 16:34:26 2024 +0900
[ルーティング編集作業]認証と一覧画面のルーティングを設定
commit 5a79aaf9a1556f2e168218af5dad90631a576ecc
Date: Sat Apr 13 16:33:08 2024 +0900
[コミット1]依存関係設定
↑コミット2とコミット3がひとつのコミットに圧縮されている。