Commit

The Commit view in the activity bar is IntelliJ's Commit tool window. Tick the files you want and commit. Staging never enters into it: the checkboxes are the commit, and a file is committed as it is on disk.

The Commit tool window. A Changes group lists five files with checkboxes, some ticked and some not, each marked with its status letter. Unversioned files sit in their own group below. A commit message is typed underneath, above Commit and Commit and Push buttons.
Changes and Unversioned Files, grouped by directory, with the status letter on the right and the message box below.

The tree

The Commit view with the context menu open on router.ts: Show Diff ⌘D, Jump to Source, Open in System Folder, Rollback… ⌥⌘Z, Shelve Changes…, Delete….
The file context menu in the Commit view.

Hunks and lines

Open a changed file's diff and the working-tree side has gutter controls per change: include this hunk, exclude it, or revert it. A change can also be addressed by its line range, which is how the diff reaches exactly the block you pointed at when git has merged neighbouring changes into one hunk. Porcelain rebuilds a patch from just the chosen hunks and lets git apply it with context still verified, so a file that changed underneath refuses to apply in the wrong place. The tree checkbox and the per-hunk state stay in sync.

A HEAD ↔ Working Tree diff of src/router.ts opened from the Commit view. The one changed line, response.setHeader, is highlighted on the working-tree side, with a checkbox in the centre gutter beside it and a Revert this change control.
A working-tree diff from the Commit view. The checkbox in the gutter is the hunk's inclusion; Revert this change sits beside it.

The message

Rollback

Rollback on a selection reverts those files to HEAD, after a dialog that lists them. For added files it offers to delete the local copies, the way IntelliJ's dialog does. Per-hunk rollback from the editor gutter is VS Code's own quick-diff revert, and I've left that alone.