2つ以上前のcommitにamendする
λ git commit --fixupとλ git rebase -iを使う
amendなので、追加した方のcommit messageは残らない
λ git rebase -iだけでも手動でやれば実現できるがちょっと楽になる
2つのパターンがある
今から作るcommitを、過去のcommitにamendしたい
既にあるcommitを、他のcommitにamendしたい
今から作るcommitを、過去のcommitにamendしたい
手順(git fixupが使える場合)
対象の変更をstagingに入れる
$ git fixup
選択肢が出るので、該当のcommitを選択
正規の手順
対象の変更をstagingに入れる
$ git commit --fixup <target hash>
$ git rebase -i --autosquash <target hash>~
target commitの末尾にgitの~をつけて1つ前を指定する
2段階の省略ができる
commit hashを省略
λ git rebase --i --autosquash
現在のbranchのUpstream Branchがrebaseの起点になる
--autosquashを省略
rebase.autosquash = true
editorが開くが何もせずに閉じれば良い
--fixupの引数は、
対象のcommitのcommit hashでもいいし、
@^^^や@~3のようなheadからの相対でもいいし、
:/<targetのmessageの部分文字列>でも良い
e.g. 対象のcommitのcommit messageがhogepiyoなら:/hogeとか:/gepとか
こうしてcommitした場合、
commit messageを入力するタイミングがない(不要なので)
commit messageは、fixup!: <対象のcommit message>のような表示になる
fixupを複数溜めてから後でまとめてautosquashしてもいい
--fixupを使わずとも、自分でcommit messageに「fixup!」と書いてもいい
--autosquashを付けなくても普通にλ git rebase -iして同じことが出来るが、
付けると自動的にrebase表示時の場所を移動してくれるため、
特に何の編集も不要でeditorを閉じれば操作が完了する
いちいちautosquashを後でやるのがめんどいな?mrsekut.icon
既にあるcommitを、他のcommitにamendしたい
上と同じことを手動でやるイメージ
手順
$ git rebase -i <target hash>~
末尾にgitの~をつける
targetはamendする対象のことmrsekut.icon
fixupを指定する
普通のrebaseのときのように、targetの下に移動させる
code:log
pick 4917aae amend先のtargetとなるcommit
fixup 50689a2 今からamendしたいcommit
fixupを指定する
editorを閉じる
ちょいテク
rebase.autosquash = true
まとめてsquashをやるgithub actionもあるらしい
globalなgit hookで同じことできないかな