Hey Early Birds!

Get a jump on the day and install git now!

http://git-scm.com/downloads

Download latest version of Git

Intro to Git and Github

slides: http://cherimarie.github.io/gdi-core-git-github

Welcome!

Girl Develop It is here to provide affordable and accessible programs to learn software through mentorship and hands-on instruction.

Some "rules"

  • We are here for you!
  • Every question is important
  • Help each other
  • Have fun

Welcome!

Tell us about yourself.

  • Who are you?
  • What do you hope to get out of the class?
  • Who was your favorite fictional character as a child?

What we will cover today

  • What is version control?
  • Basics of git -- the essential commands
  • "Gitting" social with Github

Real talk

Git isn't simple. Like most powerful tools, it's complex and takes some time to master.

What is version control?

Version control allows you (and your team) to do two powerful things

Collaborate

Create anything with other people, from academic papers to entire websites and applications.

Track and revert changes

Mistakes happen. Wouldn't it be nice if you could see the changes that have been made and go "back in time" to fix something that went wrong?

Working without Version Control

Trying to make a grocery list with 5 people and no version control

The Horror!

Working with Version Control

Successfully making a grocery list with 5 people and version control

Rainbows and bunny rabbits!

Brief history of Version Control

1990s -- CVS (Concurrent Version Systems)

2000s -- SVN (Apache Subversion)

2005 -- Git (well, Git)

Version Control Types

Centralized Version Control

Examples: CVS, SVN

One central server, each client (person) checks out and merges changes to main server

Distributed Version Control

Examples: Git, Mercurial

Each client (person) has a local repository, which they can then reconcile with the main server.

More info about the differences here.

Version Control Distribution

Version control share between Bazaar, CVS, Git, Mercurial and Subversion

Version Control Distribution Change

Version control distribution share between 2010 and 2012 between Bazaar, CVS, Git, Mercurial and Subversion

Intro to Git

Goals of Git Design

  • Fast -- add to your team and code base quickly
  • Distributed (see slide above) - you can work without a network connection
  • Each commit has a unique identifier, a SHA (Secure Hash Algorithm, a.k.a hash)
  • Everyone has a local copy of the history

Installation and Setup

Install git

http://git-scm.com/downloads

Download latest version of Git

Installation and Setup

Configure Git with your name and email


# I'm a comment! Don't enter me in command line. Do enter lines that start with a $, but don't type the $. 

$ git config --global user.name "Your Name Here"
# Sets the name git associates with your commits
          
$ git config --global user.email "your_email@example.com"
# Sets the email git associates with your commits
          
$ git config --list
# Shows your configuration settings
          

Installation and Setup

An SSH key is like a secret handshake between your computer and Github. It allows Github's servers to verify your identity via public-key cryptography and challenge-response authentication- not via you typing in your Github password. It's super secure and not too difficult to set up.

More info about SSH keys.

Installation and Setup

Setup ssh keys following this guide:

https://help.github.com/articles/generating-ssh-keys

Your first Local Repository


# change to root/home directory
cd ~
#or
cd Users\username

# create and move to a "working directory"
mkdir my-repo
cd my-repo

#initialize directory as a Git repository
git init
          

Add files

Create a new hello.txt file in your my-repo directory, then check repo status


touch hello.txt
git status
          

Tell Git to track our new file


git add hello.txt
git status
          

File is now tracked by Git!

Changes and commits

Open hello.txt and add some text, then check your git status


git status
          

Stage and commit the change


git add hello.txt
git commit -m "Added first file to repository."
          

What did we just do??

How is this all different than just saving a file?

  • When we add a file, we tell Git to track the current state of it. This is also known as 'staging' the file.
  • A commit saves changes made to staged files, not the whole files. The commit allows us to track which changes were committed when and by whom.

Look at our progress


git log

  commit [SHA HERE]
  Author: Your name 
  Date:   [DATE HERE]

      Added first file to repository.
            

Cool! We'll be using that SHA later...

Git is helpful

Always read the output of running git commands. They may look a little intimidating, but they contain all sorts of useful information. When in doubt, run:


git status
        

Git flow

This is the general workflow in a Git repository


git init            #just once, to initialize
      #do some stuff to files
git status          #what's up, git?
git add [filename]  #stage changes to a file
git commit -m ""    #commit a set of changes
git status          #what's up, git?
          

Undoing Changes

Undoing local changes

If you've added some new text to hello.txt, but not yet staged it, just run:


git checkout hello.txt 
            

hello.txt is reset to its state at the last commit - your changes are gone!

Undoing Changes

Un-stage a file

If you already staged hello.txt, run:


git reset hello.txt 
            

hello.txt is no longer staged, you can make whatever changes you like to it, and re-stage when it's ready.

Undoing Changes

Delete a staged file

If you've already staged hello.txt, but want to delete it instead, run:


git rm -f hello.txt
          

The file is deleted, and its deletion will be part of your commit.

Undoing Changes

Undo staged changes

If you've made some changes to hello.txt and staged it, but want the changes to disappear, run:


git reset hello.txt     #unstage
git checkout hello.txt  #reset
            

hello.txt is unstaged and reset to its state at the last commit - your changes are gone!

Undoing Changes

Undoing committed changes- 1

If you've made changes and committed them, you can revert all the changes that happened in a specific commit by running:


git log             #shows log of commits 
git revert [SHA]    #undoes specified commit
            

This doesn't have to be your most recent commit- you can revert any commit. It will just undo the entire set of changes that were included in that commit.

Undoing Changes

Undoing committed changes- 2

You can roll back your repo's state to where it was after any previous commit by running this with the SHA of the commit you'd like to reset to:


git log                 #shows log of commits 
git reset --hard [SHA]  #resets repo 
            

This rolls back all changes since the specified commit - be careful! This isn't often used in real life.

Branching

  • Develop different code on the same base
  • Conduct exploratory work without affecting the work on master branch
  • Incorporate changes to your master branch only when you are ready

Branching

Create a new branch called feature_1


git checkout -b feature_1
          

Make a change to hello.txt, then add and commit.

Branching

Switching branches

See all branches. Branch with * is active.


git branch
          

Switch to the master branch.


git checkout master
          

You'll notice the changes from feature_1 branch aren't there.

Merging

Merge to get changes from one branch into another*

Switch to master and merge in the feature_1 branch


git checkout master
git merge feature_1
          

Now if you check out hello.txt, you'll see the changes you made in the feature_1 branch.

*rebase is another option, but will not be covered in this workshop

Merging

Merge conflicts...

Change first line in hello.txt in master branch, then add and commit it.

Then switch to the feature_1 branch and change first line in hello.txt, and add and commit it.

Merging

Merge conflicts, cont.

Merge the master branch into feature_1 branch


# on feature_1 branch              
git merge master
          

You will be notified of a conflict. Go to the file, fix the problem and delete the helpful comments Git added. Then commit your edits.

Conflict resolved!

Merging

Merge conflicts, cont.

Note: somtimes, conflicts cause the files to automatically open in the Vim text editor. It looks just like a terminal window and has no obvious way to exit. Don't panic. Just type :q[enter] to exit it.

GitHub

  • Launched in 2008
  • Leader in Social Coding
  • GitHub is a commercial site that allows users to host Git repositories publicly and privately
  • Open source projects host or mirror their repositories on GitHub
  • Post your own code for others to use or contribute to
  • Use and learn from the code in other people's repositories

GitHub

Create your first repository

How to create a new repository.

GitHub

Create your first repository

How to create a new repository.

GitHub

ReadME

While a README isn't a required part of a GitHub repository, it is a very good idea to have one. READMEs are a great place to describe your project or add some documentation such as how to install or use your project. You might want to include contact information - if your project becomes popular people will want to help you out.

GitHub

Setting up remote connection

Copy SSH link from Github repo

link to clone repo

# from inside your local git repo
git remote add origin [pasted link from Github]
git pull origin master  
    #pull first, when creating connection
git push origin master  
    #push your local work to the repo
          

GitHub

Push to GitHub Repo

As you make changes locally, push to Github.

Make a change to your README file, then add and commit it. Then, push!


git push origin master
          

Go check out your Github repo online to see your changes.

GitHub

Pulling from remote repository

If you are working with a team, you want to make sure that you have everyone's changes before pushing your changes to the GitHub repo


#pull current state from Github
git pull origin master  
# fix any conflicts (see merge conflicts above) and commit
# then, push local changes to GitHub
git push origin master 
          

Forking

  • There are MILLIONS of public repositories on GitHub
  • If you want to use or contribute to a repository, you can fork it.
  • This will create a copy of it in your Github account

Forking

Go to https://github.com/cherimarie/GitResources and hit the fork button.

How to fork a repository. Image from https://help.github.com/articles/fork-a-repo

Forking

Cloning

Go to your GitResources repo on Github, find this link and copy it.

Link to clone repo

Forking

Cloning

Navigate to the location you want new directory to be in- NOT INSIDE ANOTHER GIT REPO! Then, clone to get a local repository of your fork.


git clone https://github.com/username/FORKED-REPO-NAME.git

cd FORKED-REPO-NAME
          

Cloning

The 'git clone' command does a lot!

  • Creates a local directory for the repo
  • Initializes that directory as a Git repo
  • Adds a remote connection called 'orgin' to the Github repo it was cloned from
  • Pulls from the Github repo so it's perfectly up-to-date

Cloning

Add a remote connection to the original repository, so you can stay up to date with their changes:


git remote add upstream https://github.com/original-username/FORKED-REPO-NAME.git
# creates a remote connection, called "upstream", to the original repo on Github

git fetch upstream
# Pulls in changes not present in your local repository, without modifying your files
        

Pull Requests

  • After you fork and clone a repository, all pushed changes will go to your fork
  • These changes will not affect the original repository
  • If you would like to get your changes to be incorporated into the original repo, you can submit a pull request

Pull Requests

  • Go to your GitResources directory
  • Add a resource to the list
  • Save, add, and commit your changes
  • Push your changes to your Github repo

git add .
git commit -m "Add great new resource"
git push origin master
          

Starting a pull request

Visit your Github repo page

Go to Pull Requests. Start a new Pull Request.

Previewing and sending pull request

How to preview and send a pull request. Image from https://help.github.com/articles/using-pull-requests

Fill out the form with a polite, helpful description, and submit.

Managing pull requests

How to manage pull requests is out of the scope of this short workshop, but you can learn more from the Github Collaborating Tutorials

Questions?

?

Thanks!

Cheri Allen

@cherimarie