How to Make a Link in GitHub: Anchors, References, and Repository URLs Explained

GitHub isn't just a place to store code — it's a collaborative workspace where linking is part of the workflow. Whether you're connecting to a file in your repo, referencing an issue, or adding a clickable URL inside a README, GitHub supports several distinct types of links. How you make a link depends entirely on where you're linking and what you're linking to.

The Two Environments Where GitHub Links Live

Before diving into syntax, it helps to understand the two main contexts:

  • Markdown files (READMEs, wikis, documentation, pull request descriptions, issue comments) — these render formatted text and support Markdown link syntax.
  • Raw file paths and repository URLs — these are direct web addresses to specific content inside a repo, and they follow GitHub's URL structure rather than Markdown rules.

Both are useful. Which one you need depends on what you're trying to accomplish.

How to Create a Clickable Link in Markdown

GitHub uses GitHub Flavored Markdown (GFM), which supports standard Markdown link syntax:

[Link text](URL) 

For example:

[Visit GitHub](https://github.com) 

This renders as a clickable hyperlink with the display text "Visit GitHub." The URL can be:

  • An absolute URL (full web address starting with https://)
  • A relative path pointing to another file in the same repository

Using Relative Links Inside a Repository

Relative links are especially useful in documentation. If your README is at the root of the repo and you want to link to a file in a subfolder:

[Setup Guide](docs/setup.md) 

GitHub resolves relative links based on the current file's location in the repository tree. This means the link stays valid even if someone forks the repo, because it doesn't hard-code a specific GitHub username or repo name.

Key behavior to know: Relative links in Markdown files work correctly when rendered on GitHub's web interface. They also respect the current branch — so a relative link from main won't break if viewed on a different branch, as long as the referenced file exists there too.

How to Link to a Specific File or Line in a Repository

You can construct direct URLs to any file in a GitHub repository using this structure:

https://github.com/{username}/{repository}/blob/{branch}/{filepath} 

To link to a specific line or range of lines, append the line number:

https://github.com/{username}/{repo}/blob/main/src/app.js#L42 

Or for a range:

https://github.com/{username}/{repo}/blob/main/src/app.js#L42-L58 

GitHub highlights the referenced lines when someone opens that URL. This is commonly used when discussing specific code in pull request comments or issue threads.

🔗 Anchor Links Within the Same Page

GitHub automatically generates anchor IDs for every heading in a Markdown file. This lets you link to specific sections:

[Jump to Installation](#installation) 

GitHub converts heading text to anchor format by:

  • Converting to lowercase
  • Replacing spaces with hyphens
  • Removing most special characters

So a heading like ## Getting Started becomes #getting-started, and ## FAQ & Troubleshooting becomes #faq--troubleshooting (ampersands are removed, adjacent hyphens retained).

You can verify any anchor by hovering over a heading in a rendered GitHub file — a link icon appears, and the URL in your browser bar shows the generated anchor.

How to Reference Issues, Pull Requests, and Commits

GitHub has built-in autolink references that turn certain patterns into clickable links automatically:

Reference TypeSyntaxWhat It Links To
Issue or PR#42Issue or pull request number 42 in the same repo
Cross-repo issueowner/repo#42Issue in a different repository
Commit SHAa3f9c12 (7+ chars)Specific commit
User mention@usernameGitHub user profile

These work inside issue comments, pull request descriptions, and commit messages — not inside Markdown files rendered as documentation.

Linking to a Specific Commit vs. a Branch

There's an important distinction between linking to a file by branch name versus by commit SHA:

  • Branch-based link:blob/main/README.md — always shows the current version on that branch. The content can change.
  • Permalink (commit SHA):blob/a3f9c12.../README.md — permanently points to that exact version of the file, even if it's later edited or deleted from the branch.

GitHub makes this easy: when viewing any file, pressing Y on your keyboard switches the URL from a branch reference to a permanent commit-based permalink. This is the safer choice when sharing links you want to remain stable over time. 📌

Variables That Affect How Your Links Behave

Several factors influence which linking approach makes sense:

  • Audience: Internal contributors familiar with repo structure can follow relative paths. External readers pasting a link into a browser need absolute URLs.
  • Link stability: Branch-based URLs change as code evolves. Commit SHA permalinks are permanent but may point to outdated content.
  • Where the link appears: Markdown syntax only renders in files and comment fields that GitHub processes as Markdown. Raw code files, for instance, won't render [text](url) — they'll show it literally.
  • Cross-repository needs: Relative links only work within the same repo. Cross-repo references require full URLs or GitHub's owner/repo#issue shorthand.
  • Public vs. private repos: Links to private repository content require the viewer to be authenticated and have access. Sharing a permalink to a private file won't work for someone outside the organization.

Inline Links vs. Reference-Style Links

Markdown also supports reference-style links, which can keep long documents cleaner:

Check out the [documentation][docs] for more detail. [docs]: https://github.com/owner/repo/blob/main/docs/README.md 

The reference is defined once at the bottom (or anywhere in the file) and reused wherever needed. This is particularly useful in technical READMEs where the same URL appears multiple times, or where long URLs would make the source hard to read.


The right linking approach in GitHub depends on a mix of factors: where the link will live, who will read it, whether you need the link to remain stable over time, and whether you're working within a single repo or across multiple ones. Each setup leads to meaningfully different choices — and the details of your own repository structure and workflow are what determine which method actually fits. 🛠️