Pull Requests
You've clicked the green Merge button and watched your branch fold into main. Now grep the whole .git/ folder for that button, the object store, the refs, the config, every command git ships, and it isn't there.
- ▸Search every byte under
.git/for the green Merge button and you come back empty: it was never there. - ▸Push three more commits and the web page's diff updates itself, no command told it to.
- ▸Same branch, three merge buttons, three different commits land on
main.
You push feature to the server and open the web page: a title box, a description, a green Merge button waiting for a click. It feels like the branch now lives somewhere new. So look for that somewhere. Run git cat-file --batch-check --batch-all-objects on the server's repo and you find every commit you pushed, they arrived with git push, before you opened anything. Then search .git/refs/, .git/config, .git/HEAD, the packed refs, every file git writes. On GitHub you find one new line: refs/pull/1/head, a ref naming the commit your push already delivered (beside it refs/pull/1/merge, a trial merge GitHub builds for its checks). The title, the description and the button are nowhere in them.
The button, the title, the description, the review thread: none of it is a git object. Opening the page ran one HTTP call to the hosting service (GitHub, GitLab, Gitea), which wrote a single row into its own database. That row records two branch names and a state, and points back at commits git already had. Clone the server's repository onto a laptop with the service nowhere on it and every commit comes down; the row does not, and neither do the refs/pull/ refs, since a clone copies only branches and tags.
The viz below puts the two stores side by side: git's object store on one side, the platform's table on the other. Trigger the open and see which store the new row lands in, and what git gains: one ref to a commit it already had.