flyhigh

Use your source, Luke!

Gitで一個前のコミットから作業したいケースと方法

概要

git revert --no-commitが使えるね、というメモ。

動機

Javaを書いていると、以下のようなバージョニングを行う。(pom.xmlなどの記述)

1
version=1-SNAPSHOT

そもそも、1.0.0-SNAPSHOTじゃないのか、という話はここでは一旦置いておく。このバージョンをリリースしたら、こうなる。

1
version=1

これでgit tag version-1などして、タグ付けしたら、バージョンをあげてコミットしたいだろう。

1
version=2-SNAPSHOT

この作業を手作業でやることになったが(自動リリーススクリプトがうごかないケースがあった)、記述箇所が多い為、sedで置換などする。 1-SNAPSHOT1にするのは、簡単だった。しかし、12-SNAPSHOTにするのは至難である。 1はバージョン以外にも使われてる為である。 だったらコミット前の状態(1-SNAPSHOTから1にしたもの)に戻して、1-SNAPSHOT2-SNAPSHOTに置換したい。

git reset HEAD^ではなく?

git reset HEAD^を試してみる。1-SNAPSHOTに戻った。さて、これを2-SNAPSHOTにしよう。 置換できた。コミットしよう。。。 いや、だめだ。これだと分岐してしまう。 この状態をパッチにして、HEADに当てようか、、いや、それもだめだ。 HEADは1がbaseであるためパッチはあたらない。 commitの逆操作をcommitなしにパッチとして取り出して、それを書き換えたい。

どうやるか

git revertは、あるコミットを打ち消すコミットをすると記憶していた。 具体的には + 逆操作を行うパッチを作成する + パッチをコミットする という2段階の操作が行われる。これを1段階目だけで終えたい。そのためには、git revert --no-commit(もしくは-n)とすればいいそうだ。

1
2
3
4
git revert HEAD --no-commit
git reset HEAD 
(1-SNAPSHOTを2-SNAPSHOTへ置換)
git commit

かゆいところに手が届く。やはり良い。

参考