A Git repository is like a stack of pancakes. A really weird stack of pancakes.
The top pancake is the most recent revision of your code.
The index is the cake batter you have baking in your pan. It'll become a beatiful pancake when you think it is done, and be added to the top of your stack. The cake batter in your bowl are the changes you have neither committet nor added to the index.
A commit is when a pancake is done baking, and you commit it and place it on the top of your stack.
A branch is when you impale your stack with two steel wires, such that you can start two new stacks on top of your current stack. Actually, though, a branch is just the name you give to "the top pancake" of a stack, so it's like a pointer in that sense, and a tag is a pointer to a specific pancake placed somewhere in the middle of it all.