7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

`git blame`と`git rebase`の使用例

Posted at

はじめに

↑ の記事で git blame便利そ~ git rebase使い道わからん~hoge~ってやってたんですが、
ありがたいコメントを契機に、一気に理解できたので記事にさせていただきます。

いただいたコメント

私の場合、git rebase で コミット整理する際に よく使います。
ちょっとした間違いを修正するときとか
(git commit --amend の、ずっと前のコミットでも直せる版)。

git rebaseする前に、修正対象コミット を見つけるために、git blameするんです。

やり方としては:
直したい行をコミットしちゃったコミットを、
git blame で特定しておきます。

見つけたコミットに対して、修正コミットを、
git commit --fixup COMMIT,
git commit --squash COMMIT
というオプション付きで コミットします。
すると、対象の COMMIT のコミットメッセージを使って、
fixup! COMMIT のコミットメッセージ
squash! COMMIT のコミットメッセージ
というメッセージで コミットができます。

その後、git rebase -i --autosquash BASE_COMMIT すると、
自動的に、COMMIT の直後に 修正コミットを持ってきて、COMMIT とくっつけようとします。
fixup / squash は、コミットメッセージ修正 なし / あり の違い。
(--autosquash の並べ替えは、コミットメッセージ内容 で判定するので、
同一のコミットメッセージが rebase範囲に絡むと、誤爆しうる。
あと、手動で fixup! squash! を足したコミットメッセージ でコミットしても、効果は同じ。)

首尾よく rebaseできれば、対象の COMMIT が、
間違えていた行を 正しく修正したコミットに生まれ変わります。

なお、git commit --fixupgit commit --squash を使いましたが;
git rebase -i で 自分で指示するなら、
普通にコミットしたうえで、自分で並び替えてもいいです。

長文ありがたい・・・めっちゃ丁寧・・・これはしっかり理解せねば。

わかりやすかった具体例

ChatGPTに示してもらった具体例で完全に理解しました。

具体例を用いて、git blame, git commit --fixup/--squash, およびgit rebase -i --autosquashを使用したコミットの整理プロセスを説明します。この例では、example.rbファイルを修正し、過去のコミットに統合するプロセスを示します。

初期のコミット履歴

最初に、プロジェクトのコミット履歴を見てみましょう。以下はシンプルな履歴の例です。

a1b2c3d [最新] Fix typo in README
e4f5g6h Update example.rb with new feature
i7j8k9l Initial commit

ステップ1: git blameで修正対象のコミットを特定

example.rbの特定の行に問題があり、それがどのコミットで導入されたかを特定します。

git blame example.rb

このコマンドの結果から、e4f5g6hコミットが修正対象であることを特定しました。

ステップ2: 修正を加え、git commit --fixupで修正コミットを作成

example.rbに修正を加え、ステージングした後、git commit --fixup e4f5g6hを実行します。

git add example.rb
git commit --fixup e4f5g6h

これにより、次のようなコミットが追加されます:

a2b3c4d [最新] fixup! Update example.rb with new feature
a1b2c3d Fix typo in README
e4f5g6h Update example.rb with new feature
i7j8k9l Initial commit

ステップ3: git rebase -i --autosquashでコミットを整理

i7j8k9lコミットからリベースを開始します。

git rebase -i --autosquash i7j8k9l

このコマンドはインタラクティブなリベースセッションを開始し、fixup!プレフィックスを持つコミットを自動的に元のコミットに統合するように指示します。

実行後のコミット履歴

リベースが完了すると、コミット履歴は次のようになります。

a3b4c5d [最新] Fix typo in README
e5f6g7h Update example.rb with new feature (and fixes)
i7j8k9l Initial commit

e4f5g6hコミットはe5f6g7hになり、元の変更とfixup!による修正が統合されました。コミットメッセージは元のコミットから引き継がれ、必要に応じて編集できます。

このプロセスにより、プロジェクトの履歴がクリーンに保たれ、過去のコミットに対する修正が簡単に行えるようになります。

おわりに

改めてコメントありがとうございました。

git rebaseの使い道を知ってエンジニアとして1レベルアップした気分です。

あとはこれを実践して身体に覚えさせる・・・!

7
10
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
7
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?