revert, reset, rebase, ...
例によって自分用のメモ。間違ってる場合はツッコんでください。
「svn revert」は「working copy の変更をなかったことに」してやり直すために使う。update でコリジョンが起きた場合にこれを使うと問題なく repository の状態に追随できる場合が多い。
「git revert」はコミットそのものをなかったことにする。はずだったような気がしてたんだけど、「コミットそのものをなかったことにするコミットを行う」。言い換えると revert しましたという記録を残す。
git で svn revert 相当のことをやりたい場合は
- git checkout
- git reset
のどっちかでいいような気がする。こんな感じに使う。
git checkout BRANCH
git reset COMMIT
git reset の動作は3種類。
- –mixed
- working tree には触れずに index の commit をなかったことにする。デフォルトの動作。
- –soft
- index も working tree もまったくタッチしないって言ってるような気がするんだけど、自分が試したら見事に修正分がぶっ飛んだ。意味が分からん。怖くて使えん。
- –hard
- こっちが本当は自分の作業を全部ぶっ飛ばしてしまう動作のはず。
あちこちでいろんな人が言ってるけど git ってほんとよく分からん。根本的な考え方が他のツールと合ってない部分が多く、使う言葉が違うので当てずっぽで作業すると痛い目にあう。もちろん互換性を捨てたおかげで良くなっている点もあるんだろうけど、移行するにはハードルが結構高い気がする。
ということで最近では凝ったことする前に Mercurial にも突っ込んで意図しない動作をしても元に戻せるようにして作業している。git は便利だがなんか怖い。
ただ、Emacs の vc-mode で vc-revert-buffer すると svn だろうと git だろうと同じように扱える。一回に一つのファイルしか revert できないけど、すでに Emacs と vc-mode を使えている人はこれ使うのがいちばん確実だと思う。vc-mode がいつから git に対応しているのか細かことは知らないけど、たぶん 21 は NG で 22 は OK だと思う。
rebase はなんかよく分からなかった。名前がちょっと似ているだけでまったく別な機能らしい。