Gitを使っていて面白い挙動に出会ったのでメモ。
シチュエーションとしてはこんな感じ。
- ファイル"foo"を少し編集して、OSのコマンドで"bar"にリネームした。
- git add bar
- git rm foo
1の直後は、fooが削除されたことになっているが、もちろんfooが削除されたことはインデックスには登録されていない。すなわちコミット対象ではない。
# Changes not staged for commit:
# deleted: foo
そして、当然barはトラックされていない。
2の直後は、barが新規に追加されたことになっている。インデックスにaddされたので、barはコミット対象である。
# Changes to be committed:
# new file: bar
3の直後は、fooがbarにリネームされたことになっている!(ここが面白いと思ったところ)
# Changes to be committed:
# renamed: foo -> bar
以前先輩と実験したときも、Gitのリネーム判断は結構面白い挙動をするなあという印象だった。本当に名前を変えたのか、削除して新規作成したのかにかかわらず、ファイルの内容の類似度でリネームかどうかを判断しているらしい。