Git/OpenWest 2016 Git Basics

Presentation
Presentation: https://www.openwest.org/schedule/#talk-190

Slides: https://drive.google.com/open?id=1DUYry3lm66y_be_eerQblcmr27HI31FWnOxaUcnQSJY

Presenter: Author: Mike Straw 

Description:
 * "Git (https://git-scm.com/) is an open source distributed version control system that can and does help manage everything from the smallest to the largest development environments. In this tutorial, we’ll explore the basics of using Git, and get our hands dirty with a small development environment using command-line, GUI, and web-based interfaces and look at some tools that can make Git even easier."

Git
https://git-scm.com/

VCS
Version Control System

types:
 * Local (eg. Word Track Changes)
 * Centralized (eg. Subversion)
 * Decentralized (eg. Git, Mercurial)

Git tracks changes, not versions, called "change sets"

Three tree architecture:
 * working
 * staging (git add)
 * repository (git commit)

Configuration
Config:
 * system (--system)   # /etc/gitconfig
 * git config --system -l
 * user (--global)   # ~/.gitconfig
 * git config --global -l
 * file (--file) [file]  # specify config
 * git config --file .git/config -l
 * project --file .git/config
 * git config --file .git/config -l
 * all
 * git config -l

Config: git config --global user.name 'Kenneth Burgener' git config --global user.email 'kenneth@oeey.com' git config --global core.editor /usr/bin/vim   # set editor to vim git config --global core.editor `which vim`   # set editor to vim git config --global color.ui true   # use color git config --global -l   # list user configurations git config --system -l   # list system configurations git config --file .git/config -l   # list project configurations git config -l   # list all configurations

Help
Help: git help git help init git help log

Basics
Verison: git --version

First Project: mkdir gittest cd gittest git init ls .git

Status: git status

Stage file: git add file.txt

git add.
 * 1) stage all files below current directory:

Stage file example: git status touch file1.txt git add file1.txt git status

Commit: git commit -m 'my first commit' git commit  # will ask for message in editor

Log: git log git log -n 1 git log -1 git log git log .. git log --grep="first" git log --since=” ” git log --pretty=short git log --oneline   # this one is useful git log --pretty=format:"%h - %an, %ar : %s" git help log

Hashes:
 * Codes on commit and log are SHA-1 encrypted hashes
 * Based on exact contents of data - will change if tampered with
 * Can refer to them by the first # of chars to make it unique (usually 8-10)

Upstaging a file: echo "changes" >> file1.txt git checkout file1.txt

Stash
git stash git pop

Tags
Tags: git tag 1.0   # tag current code as 1.0 git tag   # shows list of tags git tag -l   # shows list of tags cat .git/refs/tags/1.0   # show tag 1.0 hash git show 1.0   # show tag change set git tag -a v1.2 9fceb02   # create a tag 'v1.2' at hash '9fceb02' git push origin v1.2   # push tag to remote (does not happen by default) git push origin --tags   # show remote tags git checkout v1.2   # checkout changeset at tag v1.2 git checkout -b version12 v1.2   # checkout changeset at tag v1.2 as new branch

Reset
Reset file back to last commit: git checkout -- file1.txt

git checkout --.

Reset staged change: git reset HEAD file1.txt

Removing a file
Ugly way: rm file1.txt git add file1.txt

Cleaner way: git rm file1.txt

Amending Commit Message
Change last commit message: commit --amend -m 'new message'

Diff
git diff git diff git diff

Branching
Create a branch: (but not switch to it) git branch

Switch to an existing branch: git checkout

Create and switch to branch all in one: git checkout -b

Switch to an existing branch: git checkout

List branches: git branch

Merge other branch into current branch: git merge

git checkout master git merge mybranch  # merge mybranch into master

Rename a branch: git branch -m

Delete a fully merged branch: git branch -d

Delete a branch: (with prejudice) git branch -D

Merging
Merge other branch into current branch: git merge

git checkout master git merge mybranch  # merge mybranch into master

Complete merge: git add  git commit -m 'merged files'
 * 1) edit conflicted files

Abort current merge attempt: git merge --abort

This doesn't seem to work, but this does: git checkout master -f

Remote Repositories
git clone

List branches, including remote: git branch -a

Checkout remote branch: git checkout -b

Get all remote branches (from clean directory): git clone --mirror .git git config --bool core.bare false git reset --hard

Example: git clone ssh://openwest@openwest.thestraws.net/home/openwest/git_demo # password:4Git2016$tuff

Update from remote: git fetch git pull

Push changes: git push

Push branch: git push -u origin 

Push all branches: git push --all -u

Pull all branch git pull --all

github
https://github.com

Can treat like a remote repository

e.g.: git clone https://github.com/scottw/dvcsh

Or visit https://github.com/scottw/dvcsh

github guide: hello world https://guides.github.com/activities/hello-world/

Other Interfaces
GUIs Web based
 * Git GUI https://git-scm.com/docs/git-gui
 * Eclipse Plugin http://www.eclipse.org/egit/
 * SourceTree https://www.atlassian.com/software/sourcetree
 * Etc., etc., etc.
 * Bitbucket / Bitbucket Server (f.k.a. Stash) https://www.atlassian.com/software/bitbucket

dig deeper
Pro Git: https://git-scm.com/book (also in your cloned project)

Git Completion: https://git-scm.com/book/en/v2/Git-in-Other-Environments-Git-in-Bash

GitHub: https://help.github.com/