Version control allows you (and your team) to do two powerful things
Create anything with other people, from academic papers to entire websites and applications.
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?
Trying to make a grocery list with 5 people and no version control
The Horror!
Successfully making a grocery list with 5 people and version control
Rainbows and bunny rabbits!
1990s - CVS (Concurrent Version Systems)
2000s - SVN (Apache Subversion)
2005 - Git (well, Git)
Goals of Git Design
Install GitHub for Desktop
Login with that account on GitHub for Desktop
How is this all different than just saving a file?
      
        git log
      
    
    
      
        commit [HASH HERE]
        Author: Your name 
        Date:   [DATE HERE]
        First commit. Added hello world to repository.
       
    
  If you haven't committed yet
Open hello_world.txt and add some new text
        
          change hello_world.txt
          git checkout hello_world.txt
        
      
    Look at hello_world.txt. Your changes are gone.
Open hello_world.txt and add some new text
        
          git add hello_world.txt
          git reset HEAD hello_world.txt
          git checkout hello_world.txt
        
      
    Look at hello_world.txt. Your changes are gone.
Open hello_world.txt and add some new text
        
          git add hello_world.txt
          git commit -am 'Changing and committing some lines'
          git log --pretty=oneline
          git revert [HASH]
        
      
    Look at hello_world.txt. Your changes are gone.
Create new file my_new_file.txt
        
          git add my_new_file.txt
          git reset my_new_file.txt
        
      
  Create new file my_other_file.txt
      
        git add my_other_file.txt
      
    
    Manually delete your file
      
        git rm my_other_file.txt
      
    
  Create a new branch called version2
      
        git checkout -b version2
      
    
    Add new lines to hello_world.txt
      
        git add hello_world.txt
        git commit -m 'Adding changes to version 2'
      
    
  See all branches. Branch with * is active
      
        git branch
      
    
    Switch to master and look at hello_world.txt
      
        git checkout master
      
    
    Switch to version2 and look at hello_world.txt
      
        git checkout version2
      
    
  Switch to master and merge changes
      
        git checkout master
        git merge version2
      
    
    *rebase is another option, but will not be covered in this workshop
Change first line in hello_world.txt in master branch
      
        git add hello_world.txt
        git commit -m 'Changing first line in master'
      
    
    Change first line in hello_world.txt in version2 branch
      
        git checkout version2
        # open hello_world.txt and change first line
        git add hello_world.txt
        git commit -m 'Changing first line in version2'
      
    
  Merge from master into version2
      
        git merge master
      
    
    You will be notified of a conflict. Go to the file and fix the problem. Then commit your edits.
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.
      
        cd ../ # Back in root directory
        mkdir hello-github
        cd hello-github
        git init
        git remote add origin git@github.com:username/NAME-OF-REPO
        git pull origin master
      
    
  Edit the ReadMe file
      
        git add README
        git commit -m 'Updating readme file'
        git push origin master
      
    
    Go look at your github repo online
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
      
        # Commit local changes
        git commit -m 'My latest commit'
        # Pull changes other people have made
        git pull origin master
        # Fix any conflicts (see merge conflicts above) and commit
        git commit -m 'Fixing merging conflicts'
        # Push local changes to GitHub
        git push origin master
      
    
   
  Clone to get a local repository of your fork
      
        cd ../
        git clone https://github.com/username/FORKED-REPO-NAME.git
        cd FORKED-REPO-NAME
        git remote add upstream https://github.com/original-username/FORKED-REPO-NAME.git
        #Assigns the original repository to a remote called 'upstream'
        git fetch upstream
        #Pulls in changes not present in your local repository, without modifying your files
      
    
   
   
  How to manage pull requests is out of the scope of this short workshop, but you can learn more from the Github Collaborating Tutorials