Git過去改変ことはじめ【初心者向け】
はじめに
Gitの過去を改変する簡単なトピックをまとめていきます。(n番煎じ)
網羅的な紹介ではなく、私自身が普段よく使用するコマンドたちをピンポイントで紹介します。いつもお世話になっております。
結論
- 直前のコミットを改変するには、
git commit --amend - 2つ以上前のコミットを改変するには、
git rebase -i
直前のコミットを改変したい: git commit --amend
トピック①: 直前のコミットのコミットメッセージを変更したい
🐦「あ、タイポしたコミットメッセージでコミットしちゃった...」
🐦「あ、コミットメッセージにプレフィックスつけ忘れちゃった...」
など、直前のコミットメッセージを修正したいこと、よくあると思います。
そんな時はgit commit --amendです。
git commit --amend -m "修正メッセージ"
実例

改変前


改変後
ちなみに
-mオプションをつけない場合、エディタモードが展開して直前のコミットメッセージを修正できます。「プレフィクスつけ忘れた」など軽微なメッセージ修正の場合はこちらの方が有用です。

トピック②: 直前のコミットに混ぜてコミットしたい
🐦「あ、この差分ステージングから漏れてたのにコミットしちゃった...」
など、ある差分を直前のコミットに混ぜて(コミットメッセージの変更はしないまま)コミットしたいこと、よくあると思います。
そんな時はgit commit --amend --no-editです。
git commit --amend --no-edit
実例

改変前(h1の差分のみ)

混ぜたい差分をステージング & 改変コミット

改変後(直前のコミットにpの差分も追加されている)
Gitのエイリアスについて
この直前のコミットに混ぜてコミットするという過去改変、個人的によく使うためエイリアスにコマンドを登録しています。
git cma
# = git commit --amend --no-edit
エイリアスの登録方法はこちらの記事をご参照まで。
2つ以上前のコミットを改変したい: git rebase -i
トピック③: 2つ以上前のコミットのコミットメッセージを変更したい
🐦「あ、よく考えたらこの4つ前のコミット、メッセージがおかしいな...」
🐦「あ、直前のコミットのメッセージ変更しようとしてたのに、新たなコミット積んじゃった...」
など、2つ以上前のコミットのコミットメッセージを変更したいこと、よくあると思います。
そんな時はgit rebase -iです。
HEAD~{n}でnつ前までのコミットを改変できます。
git rebase -i HEAD~{n}
実行するとエディタモードが展開し、nつ前までのコミットをすべて改変することが可能です。(vim操作が必要)

エディタモード
エディタモードでは{command} {commitID} {commit message}という並びで過去のコミットが羅列され、{command}に特定のコマンドを指定することでそのコミットに対し任意の操作を行うことができます。
エディタモードの# Commands:以下にもすべてのコマンドの説明が載っていますが、今回のように「コミットメッセージを変更したい」という場合はr (reword)コマンドを使用します。
実例

エディタモード展開(5つ前までのコミットを改変)

メッセージを変更したいコミットへrコマンドを指定
↓ :xで保存してエディタモードを終了

再びエディタモードが展開。ここでメッセージを修正する
↓ :xで保存してエディタモードを終了

過去改変完了
vim操作の便利トピック
単語上にカーソルがある状態でdiwコマンドを入力すると、その単語を削除できます(厳密にはカットされているため、その後ペーストが可能です)。
- 単語上にカーソルを置き
diw i-
rコマンド入力
という操作でスムーズに変更可能です。

↓ diw

トピック④: 2つ以上前のコミットに差分を混ぜたい
🐦「この差分2つ前のコミットと一緒に積むべきだったな...」
🐦「『漏れていたためコミット』ていうコミット積みたくないな...」
など、とある差分を2つ以上前のコミットに混ぜてコミットしたいこと、よくあると思います。
そんな時はgit rebase -iのf (fixup)コマンドです。
このコマンドであるコミットを特定のコミットにマージすることが可能です。
実例
「11番目のコミット」を「6番目のコミット」にマージする方法を見ていきます。

改変前

git rebase -i HEAD~{n}でエディタモードを展開
↓ 「11番目のコミット」のコミットIDをヤンクし「6番目のコミット」の1行下に貼り付け、fコマンドを指定します。

↓ 「11番目のコミット」の行を削除し、保存して終了

これで完了です。「11番目のコミット」が「6番目のコミット」にマージされました。

おわりに
ここまで私が普段よく使うGitの過去改変をまとめてきました。
一丁前にGitのコマンドやvim操作の紹介をしてきましたが、私自身全然使いこなせていませんしわからないことだらけです。
記事の内容について気になった点、誤っている点、またよりよい方法などありましたらぜひコメントいただけるとありがたいです。
Discussion