ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

よくわからない git rebase のつかいかた

http://blog-imgs-26.fc2.com/p/u/k/pukitimahome/201104221658360c8.jpg

「私……全てのコミットを生まれる前に消し去りたい!全ての宇宙、過去と未来の全てのコミットをこの手で」*1
「その祈りは!?そんな祈りが叶うとすればそれは時間干渉なんてレベルじゃない。因果律そのもに対する反逆だ!君は本当に神になるつもりかい?」

バージョン管理ツールを使っている以上、「過去の歴史を書き換え、時には消してしまう」というのはある意味反逆行為とも言えます。でもそれができてしまうのがgit rebase?というのが使ってみた感想です。ちょうどいい感じで手元に「入門git」があります。インタラクティブにrebaseするという例がいくつかがあったのでやってみました。

git rebase -i hash75rcvyibuonipjmok
git rebase -i HEAD^^^^^^^^^^^^

みたいな感じで使うとコミットログが書き込まれた状態でエディターが起動します。こうなったら、あとはコミットを合体させたり、分割したり、順番を変えたり、なかったことにしたりと、やりたい放題できます。
変更を保存すればあとはgitがよきに計らってうまいことやってくれるらしいです。

使うことになった経緯

コミットログを圧縮したかったんです。あとブランチを生やすところを少し前にしたかったのもあります。これはチェックアウトするときにリビジョンのハッシュを前もってメモしておくなりクリップボードに取っておくなりすればよかったんですけどね。そうとはつゆ知らず無造作にブランチ切ってしまったんです。で、ておくれたわけです。
あとあれmasterブランチをリクエストに投げちゃったけどどうしよう…とか。いろいろ調べてると、masterブランチをpull requestに投げるのあまりお勧めじゃないらしいとのことなので…*2

結局どうしたの?

  1. git checkout 7c6vuibyuonijpn -b hoge ってかんじでブランチを作りつつチェックアウトする
  2. git log でハッシュを確認する
  3. git rebase -i 75crv68tbyunoipmo って感じでハッシュを打ち込む
  4. なかったことにしたいコミットログを削除して保存
  5. git push origin hoge --force で強制的にリモートブランチへpush

で事足りました。めんどい…

*1:Gitのコミットをgit から始まるコマンドだけで消すのは多分無理だったはず。ただし、.gitというディレクトリを消すとあっさりとコミットログが全部消えてなくなります。

*2:こちらについてはとりあえず保留ということにしています