Most people use the Hub as a download button
Open a model page — openai/whisper-large-v3, say — and look at the tabs across the top: Model card, Files and versions, Community. Then look inside Files and versions. There is a commit history. There are branches. Under Community there are pull requests sitting alongside the discussion threads.
None of that is decoration. A Hugging Face repository is a git repository. The model card is a file called README.md inside it. The weights are files committed to it. The Hub is a git host that happens to be full of neural networks, and almost everything confusing about the platform stops being confusing once you hold that one fact.
What being git actually buys you
A model has versions, and `main` moves. When a lab fixes a tokenizer bug or reuploads a corrected checkpoint, the repository gets a new commit. If your code says from_pretrained("some-org/some-model"), it means *whatever is on main at the moment it runs*. That is fine while you are experimenting and a real hazard in something you have shipped, because your model can change without your code changing. Every loading function takes a revision argument, and it accepts a branch, a tag, or a commit hash:
from transformers import AutoModel
model = AutoModel.from_pretrained(
"sentence-transformers/all-MiniLM-L6-v2",
revision="PASTE_THE_COMMIT_HASH_FROM_THE_HISTORY_TAB",
)Copy the hash from the History link in Files and versions. Pinning costs you nothing and removes a whole category of Monday morning.
You can read the diff. History shows what changed and when. If a model started behaving differently last week, that is the first place to look, and often the last.
Anyone can open a pull request. Someone adds a missing licence tag, converts weights to safetensors, translates a card into Hindi. On the Hub these live as real git refs like refs/pr/4, so you can download and test a proposed change before it is merged.
Nothing has to be public. A repository can be private, and every command below works the same way with a token.
The big files are not really in git
Git was built for source code. It handles a 5 GB tensor file badly. So the Hub keeps the *pointers* in git and the *bytes* in a separate large-file store — Git LFS originally, and since 2025 Hugging Face has been moving repositories onto its own chunk-level storage that deduplicates blocks, so reuploading a slightly changed checkpoint does not resend the whole thing. You do not need to know which one sits behind a given repo. You do need to know one consequence.
Run this on a machine that does not have Git LFS installed:
git clone https://huggingface.co/openai/whisper-smallYou get a folder with all the right filenames and a model.safetensors that is about 130 bytes. It is not corrupt and the download did not fail. It is the pointer file — a few lines of text naming an object hash — because git faithfully cloned exactly what was committed, and nothing fetched the real object. People lose an hour to this and conclude the model is broken.
Three ways to actually get the files
The browser. Every file has a download link. On a phone this is the only route, and for one 200 MB file it is fine. Direct URLs follow a single pattern worth memorising: https://huggingface.co/<owner>/<repo>/resolve/main/<filename>.
The command line. Install the client and use it instead of raw git:
pip install -U huggingface_hub
hf download openai/whisper-smallThe command was called huggingface-cli for years and was renamed to hf in 2025. If your shell says hf: command not found, upgrade the package, or use the old name — both are common in tutorials you will find. hf download resolves large files properly, resumes an interrupted transfer, and puts everything in a shared cache rather than a folder you will forget about. That last part matters more than it sounds; lesson seven is about the disk it fills.
Python, when you want one file. A repository often holds three copies of the same weights in different formats. You rarely want all of them:
from huggingface_hub import hf_hub_download
path = hf_hub_download("openai/whisper-small", "model.safetensors")For a subset, snapshot_download takes allow_patterns — passing ["*.safetensors", "*.json"] skips the duplicate PyTorch .bin files and can halve what you pull down.
Do this now
Pick any model you have used through somebody else's app. Open Files and versions, then History. Count how many times it has changed since it was announced, and read the message on the most recent commit. That commit is the version you have been using.
Before you move on