CS 458 - Week 2 Labs - 11:00 am lab - 2017-08-30

*   what is Git?
    *   a popular distributed version control system

        *   invented by Linus Torvalds (yes, of Linux fame)

    *   distributed - you can keep MULTIPLE copies of a
        project in multiple locations

    *   version control - you can check in versions of the
        project, and check out not just the latest version,
	but previous versions;

*   what is GitHub?
    *   a website -- a web-based hosting service for software
        development projects (typically) that use Git

*   "Pro Git" 2nd edition (see the link under references)
    has a section on installation
    *   for a Windows box, ONE way (not the only way)
        to get a Git installer is to go to:

	windows.github.com

    *   for a Mac OS X box, one way:

        mac.github.com

    *   for (at least some flavors of) Linux, one way:

        sudo apt-get install git

*   a FEW starter git commands...

    *   you can check your git version (and/or if you HAVE git)
        with:

	git --version

    *   yes, there is a man page!

        man git

    *   a TYPICAL "syntax" for git commands is:

        git <desired-git-command> <arguments>

        *   a CONVENTION is that the man page for a git
	    command <cmd> is found by typing

	    man git-<cmd>

	    (then you run it using

	    git <cmd> ...
	    )

*   configuring user information in git
    
    use the config command

    *   you can configure info for your repos at different
        levels;

	system, global, local

	*   global - configure this info across all local
	    repositories

        *   local - configure this info JUST for (I think?)
	    a single local repository

        *   (and there's system -- see Pro Git for more info!)

*   typical for global level:

    git config --global <info-name> <info-value>

*   so, there is some config info you really OUGHT to set up
    such as:

    user.name - a name identifiable for credit when someone
        reviews user history

	git config --global user.name "Sharon Tuttle"

    user.email - an email address that will be associated
        with each history marker (under the "hood")

	git config --global user.email "st10@humboldt.edu" 
        
    *   some are more for convenience;
        color.ui - set this to auto if you'd like git
	    syntax coloring (and your terminal supports it)

        core.editor - the name of the text editor program
            you'd like to be opened up when git would do that

    *   you can see your current config values with:

        git config --list

*   because line feeds can differ for different operating systems,
    and your team may have folks using different operating systems:

    core.autocrlf

    ...lets you specify Git's protocol for handling line feeds:

    Here are 3 common values:
    *   false <-- default
        *   Git does not muck with line feeds on files
	    either when they come in or when they go out

    *   true
        *   Git changes CRLFs to LFs as files are added to
	    the project object database,
	    and changes LFs to CRLFs when you grab a file from
	    the project object database

	    ...this setting is recommended for Windows users

    *   input
        *   Git changes CRLFs to LFs as files are added
	    to the project object database,
	    but does not change line feeds when you grab a file
	    from the project object databases

	    ...this setting is generally used for Mac OS X/Linux
	    /Unix users

    so, then set this as desired:

    (on nrs-projects, you'd probably want:
    git config --global core.autocrlf input
    )

*   init repo "from scratch"

    git init <newproject-name>

    <newproject-name> is now a new directory with a .git
    subdirectory with Git repo "pieces" within;

*   turn an existing directory INTO a Git repo:

    *   cd TO that directory
    *   git init
    *   you need to ADD the current contents to the repo --
        add them, then commit those staged adds

	git add .

	...to stage everything in the current directory

	and then

	git commit -m "initial import"

*   note:
    you can see the current status of a repository
    using:

    git status

*   to CLONE a repo from ELSEWHERE

    git clone <URL-or-I-think-path>

    (the clipboard button on GitHub, when you click the
    clone-or-download button, copies that repo's GitHub URL)

*   a FEW more useful starter-commands and comments:

    *   recommended philosophy for commits:
        *   do small commits often,
	    BUT!! try to only commit things that compile
	        and work (leave the repo in a "good" state)

        *   use "social mechanisms" to get people to do that

    *   and the typical/recommended work flow:

        work, then stage, then commit

        stage/add a file that you deem ready using:

	git add <filename>

        when you want to commit your currently-staged files,

	git commit -m "descriptive log message"

        ^ you see this message when you run
	
	git log
   
        ...which lets you see a log of the commits to this repo

    *   AND what if you like the local commit,
        and this happens to be a clone,
	and you want to PUSH this local commit
	   from where you obtained it? <-- by default is called
	                                   the origin
        git push origin master

    *   to see changes between a current and committed file
    
        git diff <filename>