Using git and GitHub

From PioneerWiki
Revision as of 22:45, 3 December 2012 by S.kapusniak (talk | contribs) (Your local repository)
Jump to: navigation, search

Developing on pioneer means using the version control tool 'git' and the github website. git especially has a reputation for having a steep learning curve, so here we'll try to give you enough knowledge to be dangerous!

Prerequisites

A working installation of git, a GitHub account, and comfort with using the command line of your chosen operating system.

The GitHub sign-up page is here. Make a note of your user name as you'll need it to make your local pioneer repository.

If you're on Linux you likely have git installed already. If you can type git --version at the command line and get a version number back you're good to go. If you don't have it the package repository for your distribution almost certainly will. Use your distribution's package management tools to download and install it.

If you're the type of Linux user who builds everything from source, rolling your own kernels, I'm going to assume you're already quite familiar with git, and this was not the page you were looking for :)

On Windows you have two options, Git for Windows aka msysgit, or Github for Windows which is essentially msysgit but with some extra stuff bundled. Some of which is good (posh git) and some of which is well, not (github's 'friendly' gui). Since both include the same command line tools and cross platform gui tools, either is fine for our purposes here. The github one may be more convenient to install.

On Mac OS X, git will have been installed with XCode as git is built into the XCode IDE. However, usage of git from from within an IDE isn't something I'm familiar with so isn't covered here. If you want to follow along with this document then if you elected to install the XCode command line tools, then the git commands below should work unaltered from a terminal window. If you didn't then you'll need to use xcrun to run the commands in terminal, either by adding xcrun in front of each of the commands or aliasing git and gitk to xcrun git and xcrun gikt in your ~/.profile. Have a look at this guide for details.

Creating your pioneer repositories

Git, as a version control system, stores all source files for Pioneer (or any other project you've chosen to manage with git) along with their histories in repositories (usually shortened to just 'repos'). These are areas of a computer's file system where has git has been told to track and manage changes to the files placed in them.

There are three different repositories that you mainly deal with when developing pioneer.

  • The upstream repo. This is the main Pioneer repository stored on GitHub. This is read-only except to the core team (and even they don't do their development there).
  • The origin repo. This is a public Pioneer repository personal to you, but stored on GitHub under your username, so other people can see the changes put into it. This is read-only to everyone except you.
  • The local repo. This is your personal Pioneer repository on your computer, not accessible by anyone else.

Before you can start developing you need to setup both your Pioneer origin and local repositories.

Your origin repository

Your origin repository you make on GitHub. To do that, make sure that you're logged in there and go to the main GitHub Pioneer page in your web browser, and click the 'Fork' button at the top of that page: ForkPioneer.png


GitHub will clank and whirr as it makes a copy of the main Pioneer repo under your username. Eventually it will finish, and you'll end up on page almost exactly like the main GitHub Pioneer page, but instead of being named pioneerspacesim/pioneer your copy is named <your github user name>/pioneer.

Having made your origin repo, you're now ready to make your local one.

Your local repository

You make your your local repository by cloning a copy of you new origin repository to you local machine.

At the command line, navigate to where on your filesystem you want to put your local git repos. For instance on Linux I put mine in ~/repos whilst on Windows I put them in c:\develop\github-repos. Once you're there execute the following command replacing your github username with, well, your github username.

git clone git://github.com/your gituhub username/pioneer.git

Just like clicking Fork on the main Pioneer GitHub repo made a clone of it under your GitHub account, this makes a clone of that clone on your local machine. Expect this to take some time, just like before, as it copies all the files and the complete history of the project to your filesystem, only now it's sucking the data from GitHub to your machine, rather than copying things around within GitHub's data centre (so it will probably take even longer).

Eventually this operation will complete, and you'll have a shiny new directory named pioneer which git -- with a little encouragement -- will manage for you, your local repo.

We're almost done with repository setup, but there is one more thing we need to attend to. When you did git clone, it automatically set origin to point to your Pioneer repository on GitHub. However it didn't set upstream to point the main Pioneer Repository. We'll need to do that manually.

We must to be inside the repository to do this, in fact all the git commands from now on, you need to be inside a repository to execute any of the git commands shown. So enter the pioneer repository directory, before doing:

git remote add upstream git://github.com/pioneerspacesim/pioneer.git

...to define upstream as the main Pioneer repository. You'll notice you defined upstream as a remote, origin is also defined as a remote. We'll explain more about remotes later on.

Basic operations

git branch
git status
git checkout <branch-name>
git branch <branch-name> ; git checkout <branch-name>
git checkout -b <branch-name>
gitk
git add -A ; git commit
git commit -a
git push origin <branch name>

Updating your branches

git fetch upstream
git merge
git pull --ff-only upstream master
git merge master

Resolving Conflicts

Making a pull request

Getting code from other branches

git checkout <branch-name> -- <file-name>
git merge <branch-name>

Getting other developer's branches

git remote
git remote add <remote> <url>
git remote update
git checkout -b <branch-name> --track <remote>/<remote-branch-name

Keeping things tidy

git branch -d <branch-name>
git branch -D <branch-name>
git push origin :<branch-name>
git clean -n
git clean -f

Reviewing a pull request

Rebasing and cherry picking

Warning: Rebasing and cherry picking, although sometimes useful, can cause problems for other developers if you use them on commits that have already been published to github. Be careful and give sufficient warnings if you find you needing to use them in that situation.

git cherry-pick <commit>
gitk
git rebase <branch-name>
git rebase -i <branch-name>