実装については詳しく説明していませんが、ブランチを切り替えると、新しいの内容を反映するようにインデックスファイルが手動で更新されますHEAD
。
たとえば、ここでmaster
(1つのファイルで)分岐し、test
(2つのファイルで)分岐する必要があります。
noufal@sanitarium% git branch
master
* test
noufal@sanitarium% file .git/index
.git/index: Git index, version 2, 2 entries
noufal@sanitarium% git checkout master
Switched to branch 'master'
noufal@sanitarium% file .git/index
.git/index: Git index, version 2, 1 entries
ブランチの切り替えが発生したときにインデックスが変更されました。
また、ブランチを「手動で」切り替えると、gitはインデックスを更新せず、混乱します。上から続けます。
noufal@sanitarium% more .git/HEAD
ref: refs/heads/master
noufal@sanitarium% echo "ref: refs/heads/test" > .git/HEAD
noufal@sanitarium% file .git/index
.git/index: Git index, version 2, 1 entries
noufal@sanitarium% git status
# On branch test
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: b
#
つまり、インデックスには現在のリポジトリにあるファイルが欠落しているため、「削除のためにステージング」されます。
ステージング後のブランチの切り替えに関しては、インデックスは変更されない別の領域です。
noufal@sanitarium% git branch
* master
test
noufal@sanitarium% ls
x
noufal@sanitarium% git status
# On branch master
nothing to commit (working directory clean)
noufal@sanitarium% git checkout test
Switched to branch 'test'
noufal@sanitarium% ls
x
noufal@sanitarium% echo "Something" > b
noufal@sanitarium% git add b
noufal@sanitarium% git status
# On branch test
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
noufal@sanitarium% git checkout master
A b
Switched to branch 'master'
noufal@sanitarium% git status # Also there in index on master branch.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
noufal@sanitarium% git commit -m "Added b in master"
[master 41d0c68] Added b in master
1 file changed, 1 insertion(+)
create mode 100644 b
noufal@sanitarium% git status
# On branch master
nothing to commit (working directory clean)
noufal@sanitarium% git checkout test
Switched to branch 'test'
noufal@sanitarium% ls # Missing in the test branch although it was `git add`ed here.
x
noufal@sanitarium%