Skip to content

How we use Pull Requests to build GitHub

We recently shipped a new About section. It has all sorts of stuff like high resolution logos, pictures of the GitHub team, a little bit about our story, recent press mentions and maybe most importantly positions we're hiring for. It's awesome.

But that's not the point of this post. Instead, let's take a look at how we used a massive Pull Request to ship this feature.

We talk a lot about how GitHub works in blog posts and talks and this is a great example of how we use Pull Requests.

Here is what the PR looked like for the new About page:

You're looking at 130 commits and 91 comments from 10 different people over a two month timespan. The discussion ranged from the original idea and HTML mock-up, to Skitch mock ups from developers, to content strategy. There are designs posted for review at various points. And of course, every commit to the branch is tracked and ready for code review.

If you've ever talked to a GitHubber you'll know we think Pull Requests are the greatest thing ever. And not just because we invented them.

They are a great way to generate discussion around new ideas and recruit people to help out. Because we don't have major organizational decisions, Pull Requests let people see what's being worked on and they hop in where they think they'll add the most value. It works a lot like an Open Source project.

Some tricks to make Pull Requests more awesome for your project:

  • Open a Pull Request as early as possible

    Pull Requests are a great way to start a conversation of a feature, so start one as soon as possible- even before you are finished with the code. Your team can comment on the feature as it evolves, instead of providing all their feedback at the very end.

  • Pull Requests work branch to branch

    No one has a fork of github/github. We make Pull Requests in the same repository by opening Pull Requests for branches.

  • A Pull Request doesn't have to be merged

    Pull Requests are easy to make and a great way to get feedback and track progress on a branch. But some ideas don't make it. It's okay to close a Pull Request without merging; we do it all the time.

GitHub Enterprise 11.10.260 Release

We're excited to announce the latest release of GitHub Enterprise. The response to the product since its launch last November has blown us away and we'd like to tell you about a few of the great things we've been working on to make it even better.

With few exceptions all new features introduced on have been released in Enterprise within a week or two of their announcements. This latest release will incorporate the following new features from

In addition to that, we're also excited to announce several new Enterprise-specific features:


We're happy to announce the release of SNMP support, expanding the monitoring options available for your GitHub Enterprise installation. This is a standard SNMP installation, so you can take advantage of the many plugins available for Nagios or the monitoring system of your choice.

Suspending User Accounts

Perhaps one of the most requested features we've had to date is an easy way to disable user accounts to free up seats when an employee leaves your company. With this release, we've added the capability to suspend user accounts. This will prevent the disabled user from logging in, pulling, or pushing code -- it will also free up the seat allowing you to add a new user! All of the user's comments, issues, repositories, etc. will remain available and the account can easily be unsuspended at a later date.

SSH Access

Since we released back in November, there has been much demand for some level of SSH access to our appliance. Starting with this release, we're providing limited SSH access along with a host of CLI utilities.

Deny Force Pushes

We've also included the capability to toggle a setting for a repository that will deny force pushes. We're planning on expanding this functionality in the future to be more flexible, but for now it's a good way to prevent people from rewriting the history of a repository's master branch if you want!

VMware Tools Installer

Since the Enterprise launch, we've been using Open VM Tools on our appliance -- which is an open-source release of VMware Tools. Unfortunately, this has not really kept feature-parity with the official VMware Tools distribution and has resulted in some VMware-specific features not working properly. As of this release we're including a utility that will let you uninstall Open VM Tools and install the version of VMware Tools compatible with your version of ESXi.

We have a lot of great new features for Enterprise that are coming up on the horizon, so stay tuned! You can get more information about GitHub Enterprise at

Akavache is now open source

Today, we're open-sourcing a library that we have been using at GitHub: Akavache.

Akavache is an asynchronous, persistent key-value cache created for writing native desktop and mobile applications in C#. Think of it like memcached for desktop apps.

What does that mean?

Downloading and caching remote data from the internet while still keeping the UI responsive is a task that nearly every modern native application needs to do. However, many applications that don't take the consideration of caching into the design from the start often end up with inconsistent, duplicated code for caching different types of objects.

Akavache is a library that makes common app patterns easy, and unifies caching of different object types (i.e. HTTP responses vs. JSON objects vs. images).

It's built on a core key-value byte array store (conceptually similar to a Dictionary<string, byte[]>), and on top of that store, extensions are added to support:

  • Arbitrary objects via JSON
  • HTTP Requests
  • Fetching and loading Images
  • Securely storing User Credentials

An example - consider Twitter for Mac

When you open Twitter for Mac, you immediately see content, even before the application finishes talking to Twitter. This content is cached, but the pattern of when to refresh the data might be different. For the tweets themselves, the logic might be something like, "Load the cached data, but always fetch the latest data".

However, for the avatar images, you might have logic like, "Always load the cached image, but if the avatar is older than six hours, refresh the image."

In Akavache, the former might be:

var tweets = await BlobCache.UserAccount.GetAndFetchLatest("tweets", DownloadSomeTweets());

And the latter might be something like:

var image = await BlobCache.LocalMachine.GetAndFetchLatest(tweet.AvatarUrl, 
    createdAt => DateTimeOffset.Now - createdAt > TimeSpan.FromHours(6));

No (Thread.)Sleep 'till Brooklyn

Akavache is non-blocking, via a library called the Reactive Extensions - any operation that could delay the UI returns an Observable, which represents a future result.

Akavache also solves several difficult concurrency problems that simplify UI programming. For example, in the image above, a naive cache implementation could end up loading the GitHub avatar icon multiple times if the requests were issued at the same time (which is easy to do if you try to load the avatar for each tweet). Akavache ensures that exactly one network request is issued.

Learn More

Check out the GitHub Repository for more examples, and install the package via NuGet. Akavache is also used extensively in Play for Windows, a desktop client for Play, your employee-powered office DJ.

Introducing the New GitHub Graphs

Translations: Ukrainian.

We've revamped our existing graphs and added three new graphs to help you discover even more about GitHub hosted repositories.


See who's contributing to a project and their contributions relative to other contributors.

Commit Activity

Commit activity for the past year with a week by week breakdown.

Code Frequency

See additions and deletions over the lifetime of a project.


See individual impact over time.


See the hour and day when commits are most frequent.

The new GitHub graphs are built with the amazing d3 library by @mbostock.

Fileserver Maintenance Wednesday Night

We'll be performing some scheduled maintenance on a fileserver pair this Wednesday (April 25th, 2012) at 9PM PDT. A small percentage of repositories will be placed in maintenance mode for around 30 minutes during this process, impacting access to these repos via HTTP, Git, and SSH.

Update: The maintenance is complete. Thanks for your patience.

An easier way to create repositories

Today we're rolling out a new and improved flow for creating repositories on GitHub. To start off, you'll find a new create repository button in your header.

The new create a repository screen has been redesigned, and organizations are now front and center.

If you need to upgrade your account to add a private repository, you can now do that inside of the new repository screen.

We've also added the ability to automatically initialize a repository, along with the ability to choose a .gitignore from one of our templates.

Why don't you create a new repository and try it out?

GitHub for Mac: Easier Updates

We've just released GitHub for Mac 1.2.5 and it comes with a new update panel that helps you see what we're shipping with each release. It also contains a handy Relaunch button which will close GitHub for Mac and relaunch the update right back to where you were!

You'll see the popover the first time you update after downloading 1.2.5. It won't appear in the version you have now.

The new update should download automatically, but if you'd like to manually check for an update you can go to GitHub → Check For Updates. If you haven't installed GitHub for Mac yet, you can download it over at

Instantly Beautiful Project Pages

Ever pushed a new project to GitHub and wished you had the time or talent to make a beautiful page for it? Stop wishing. We're proud to present the new GitHub Page Generator.

To take it for a spin, go to the admin page of one of your repositories and click the Automatic Page Generator button:

Automatic Page Generator button

Once you've filled out your page text, pick from one of our eight (and counting!) themes hand-crafted by GitHub designers and developers.

GitHub Page Generator Theme Picker

Pick one, click "Publish", and you're good to go!

Publish button

We've done some hardware upgrades recently, so if you've ever used GitHub Pages before, you should notice a big page build speed increase.

We're super proud of these themes. A special thanks to all the folks who put in tons of work to make them:

Hack by Ben Bleikamp

Hack theme

Merlot by Cameron McEfee

Merlot theme

Slate by Jason Costello (he also designed the GitHub Page Generator!)

Slate theme

Time Machine by Jon Rohan

Time Machine theme

Leap Day by Matt Graham

Leap Day theme

Midnight by Matt Graham

Midnight theme

Minimal by Steve Smith

Minimal theme

Modernist by Steve Smith

Modernist theme

For more info on GitHub Pages, check out For help, check the GitHub Pages documentation.

GitHub API: Moving On

API v3 has been in place for nearly a year. We've seen a large increase in the amount of API consumers and have ambitious future plans for it. However, at some point we have to let the old code go. A single codebase will allow us to provide a more reliable and secure API.

We will terminate API v1 and API v2 in 1 month on June 1st, 2012. (Note: The date was pushed back a month from the original date).

For those that depend on the API, we're setting up a @githubapi Twitter account for announcements. You can also follow changes to the API documentation on its Git repository. The motto for API v3 has been: "it's not shipped if it's not documented".

Notable Changes for API v3

  • Versioning is done through a custom GitHub mime type. We're currently planning for the first API v3 mime type version change due to some incompatible tweaks to the output JSON.
  • Basic auth with tokens is not supported. You can create OAuth tokens for internal scripts through the Authorizations API. The benefit here is you can set OAuth scopes per token, and even attach notes to tell you what function they're serving.


Let us know through or our Contact form if API v3 is missing features that you depend on for API v2. If you have a friend or Nagios alert that's using API v2, be sure to let them know too.

OAuth Application Enhancements

We just rolled out some cool changes to how you manage OAuth applications.

First up is a newly-polished Applications settings section for both developers (application owners) and users (application users). We've also added a view into both the apps you own and the apps you've authorized.

Organizations can now own OAuth applications as well — super handy for developing applications within a team.

If you have some pre-existing apps under user accounts that need to be transferred to an org, you can transfer applications on its detail page.

We've got a lot of plans for OAuth and hope to see some awesome apps!

GitHub for Mac 1.2: Snow Octocat

Today we are announcing GitHub for Mac 1.2, an update we have dubbed Snow Octocat.

Just like its bigger-cat cousin Snow Leopard, the goal for this release was to increase the stability and speed of the app. Tests have proven that 1.2 is approximately 3.29 quadrillion times faster than 1.1 and 4293% less likely to crash. It's science.

Along with a few nice touches, we couldn't resist completely re-designing the branch browser (⌘B).

It is now easier to jump between branches without taking your hands off the keyboard. Not only that, but you can now create branches from the popover as well. Simply type the name of the branch you want to create and hit return.

This release is the result of 819 commits from our, recently expanded, team but we are just getting started.

We have big plans for the Mac app this year.

GitHub for Mac 1.2

Blob contributions box

GitHub is all about social coding. So today we're rolling out a blob contributions box.

You can see it on every blob (file) view on GitHub. It'll show you the last commit to touch the file and who's contributed to that file. Check out some examples:

The contributions box is a great way to get a feel for who's involved in a project at a glance. Hope you enjoy! for Android

We're proud to announce that for Android is now available in the Android Market! The app provides a quick overview of your traffic, top content, top referrers, and the live AirTraffic for each of your gauges.

All versions of Android from Froyo (Android 2.2) to Ice Cream Sandwich (Android 4.0) are supported.

We've started small but with the same love and attention that you've gotten from the rest of the family of apps. You'll get a quick look dashboard with all of your gauges, list views of your daily traffic, most viewed content, top web referrers and be able to watch visitors from all over the globe hit your websites as it happens with AirTraffic.

If you have a account, head on over to the Android Market and install the app - it's completely free. If you haven't tried yet, sign up for a free 7-day trial and see if is right for you!

The app is free in more than one sense of the word, as it's also open-source under the Apache 2.0 license and you can grab the source here. for Android is built on top of the awesome API as well as several great projects for Android development that are also available on GitHub:

Easier Pull Request Creation

Today, we're rolling out a new feature that makes Pull Requests easier to create:

After pushing a branch to GitHub, you (and only you) will see that branch at the top of your repo's page, along with buttons to create a Pull Request for it or compare it with master.

At GitHub, we're constantly creating and using Pull Requests. They're an indispensable tool in our internal workflow, and a key part of making open source project management with GitHub so great. We're excited to make using them easier!

Highlighting Repository Languages

Today we pushed a redesigned feature that highlights language statistics on repository home pages, allowing you to quickly see what languages a repository contains. It's a great way to get a general picture of a repository before you dive into the code.

We're using linguist to collect language statistics from repositories. Linguist is aware of common files and directories, so code like jquery or directories labeled vendor won't be included in the final count. If you happen to spot a language that linguist doesn't recognize, let us know!

Something went wrong with that request. Please try again.