この記事は何か?
本記事は「git switchしても、コミットしない限りは、ワークツリーやインデックスにおけるファイルの追加・削除は引き継がれるよね?」ということを自分の目で確かめて安心するための記事です。
使用したgitコマンド
インデックスのエントリを表示する。
$ git ls-files --stage
100644 95cf52bf4d6ad11ee7b8f1635ea0aa35eae2265b 0 main.c
BLOBオブジェクトのファイルコンテンツを表示する。
$ git cat-file -p 95cf52bf4d6ad11ee7b8f1635ea0aa35eae2265b
int main(void)
{
printf("Hello, world!\n");
return 0;
}
表の凡例
新規ファイルの追加、共通ファイルの削除
- ○ … ワークツリーの場合、ワークツリーにファイルが存在する。インデックスの場合、インデックスにファイルのエントリが存在する。
- × … ワークツリーの場合、ワークツリーにファイルが存在しない。インデックスの場合、インデックスにファイルのエントリが存在しない。
共通ファイルの編集
- ○ … ワークツリーの場合、ワークツリーのファイルの内容が編集後の内容である。インデックスの場合、インデックスのファイルのハッシュ値が編集後ファイルのハッシュ値である。
- × … ワークツリーの場合、ワークツリーにファイルの内容が編集前の内容である。インデックスの場合、インデックスのファイルのハッシュ値が編集前ファイルのハッシュ値である。
実験結果
新規ファイルの追加
ブランチAで(ブランチBに存在しない)新規ファイルを追加し、ブランチBに切り替えた後の、ワークツリーとインデックス上のファイルの有無について確認した。
| # | タイミング | Aのワークツリー | Aのインデックス | Bのワークツリー | Bのインデックス |
|---|---|---|---|---|---|
| 1 | Aで新規ファイル追加後 | ○ | × | - | - |
| 2 | Aでswitch B後 | - | - | ○ | × |
| 3 | Bでswitch A後 | ○ | × | - | - |
| 4 | Aでadd後 | ○ | ○ | - | - |
| 5 | Aでswitch B後 | - | - | ○ | ○ |
| 6 | Bでswitch A後 | ○ | ○ | - | - |
| 7 | Aでcommit後 | ○ | ○ | - | - |
| 8 | Aでswitch B後 | - | - | × | × |
| 9 | Bでswitch A後 | ○ | ○ | - | - |
コミットしない限りは、git switchしても新規ファイル追加は引き継がれるようですね。
共通ファイルの削除
ブランチAで(ブランチBにも存在する)ファイルを削除し、ブランチBに切り替えた後の、ワークツリーとインデックス上のファイルの有無について確認した。
| # | タイミング | Aのワークツリー | Aのインデックス | Bのワークツリー | Bのインデックス |
|---|---|---|---|---|---|
| 1 | Aでファイル削除後 | × | ○ | - | - |
| 2 | Aでswitch B後 | - | - | × | ○ |
| 3 | Bでswitch A後 | × | ○ | - | - |
| 4 | Aでadd後 | × | × | - | - |
| 5 | Aでswitch B後 | - | - | × | × |
| 6 | Bでswitch A後 | × | × | - | - |
| 7 | Aでcommit後 | × | × | - | - |
| 8 | Aでswitch B後 | - | - | ○ | ○ |
| 9 | Bでswitch A後 | × | × | - | - |
コミットしない限りは、git switchしてもファイル削除は引き継がれるようですね。
共通ファイルの編集
ブランチAで(ブランチBにも存在する)ファイルを編集し、ブランチBに切り替えた後の、ワークツリーとインデックス上のファイルの内容について確認した。
| # | タイミング | Aのワークツリー | Aのインデックス | Bのワークツリー | Bのインデックス |
|---|---|---|---|---|---|
| 1 | Aでファイル編集後 | ○ | × | - | - |
| 2 | Aでswitch B後 | - | - | ○ | × |
| 3 | Bでswitch A後 | ○ | × | - | - |
| 4 | Aでadd後 | ○ | ○ | - | - |
| 5 | Aでswitch B後 | - | - | ○ | ○ |
| 6 | Bでswitch A後 | ○ | ○ | - | - |
| 7 | Aでcommit後 | ○ | ○ | - | - |
| 8 | Aでswitch B後 | - | - | × | × |
| 9 | Bでswitch A後 | ○ | ○ | - | - |
コミットしない限りは、git switchしても編集後のファイルは引き継がれるようですね。
結論
思った通りで安心しました。