gitで過去のコミットに現在の差分を差し込む方法

2023年9月13日
thumbnail
gitを利用してプロジェクト開発を進めていると、本来は過去のコミットに含めなくてはいけない差分に後から気づくことがあります。
こういったケースを簡単に処理する方法としては、新しいコミットとして保存してしまいます。ただ、pushする前でしたら正しい場所に差分をamendした方が良いでしょう。
過去のコミットに差分を挿入する処理はgitコマンドからできます。ここで紹介するshellコマンドも複数のgitコマンドをまとめたものです。

Shell関数を作成

2つのgitの処理を行うコマンドを作ります。1つは特定のコミットにHEADを移すコマンドです。もう1つは差分を過去のコミットにamendしてHeadを元のブランチに戻します。
~/.zshrcを開いて以下を追加します。
function git-go-back-in-time() {
    git rebase -i $1~
}

function git-back-to-the-future() {
    git commit --amend --no-edit
    git rebase --continue
}

コマンドの使い方

例えば、このようなリポジトリとコミットログがあったとします。
article image
現在のコミットしていない差分にFirst[.]svgファイルがあります。これは本来3つ前の「Add a First[.]md file」のコミットに入れたかったファイルです。しかしすでに2つほどコミットしてログが進んでしまいました。

git-go-back-in-time

git-go-back-in-timeコマンドは目的のコミットにHEADを移動させます。引数に目的のコミットハッシュを渡します。
git-go-back-in-time aaec599cfd2525d6c9d706388f4382dc97292efc
エディタが開くので、変更したいコミットのpickをeditに変更します。
article image
保存してエディタを閉じます。Headが目的のコミットに移動します。
article image
過去のコミットに含めたいファイルまたは差分をステージに移動させます。逆に、コミットに含めたくないものはステージに上げないでください。
下の例では、First[.]svgはコミットに含まれますが、それ以外のSecond[.]svgとThird[.]svgはコミットされません。
article image
未来に戻る準備が整いました。

git-back-to-the-future

git-back-to-the-futureはステージされている差分を過去のコミットにamendしてリベースで元のブランチに戻ります。
git-back-to-the-future
ログを確認すると、過去のコミットにFirst[.]svgが登録されてHEADがmainに移動しています。
article image
以上が過去のコミットに現在の差分を差し込む方法になります。
profile image
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。