"Git is the most popular source code management and version control system in the open source community. Its complexity and power make it the best choice for most projects, while simultaneously giving it a daunting learning curve for newcomers. This talk will assume no background knowledge of version control, and will teach the basics of Git in order to give you an accurate mental model of what the tool does, and help you fix mistakes then ask the right questions if you run into problems using it later."
Note
instead of a photo of me, you get a wall of text on what i'll teach you!
Note
probably ought to encorporate https://github.com/github/training-kit http://justinhileman.info/article/git-pretty/git-pretty.png http://www.ndpsoftware.com/git-cheatsheet.html mention bisect when talking about advanced undoing ... eventually. https://github.com/k88hudson/git-flight-rules http://githut.info/ for finding repos by language on gh https://github.com/tomheon/git_by_a_bus cool analytics
How to look at software development
What's Git
Essential Git concepts & commands
GitHub
Some changes manual, other changes automatic
Note
reliability means put one file in, get same file out again, guaranteed
Note
We'll get to branches later... but you've noticed people saying oddly horticultural things like branches and trunks
Note
Unstaged | Staged | Committed
Tell Git who you are
Pick a project to work on
Note
ECDSA is the new hotness -- elliptic-curve digital signature algorithm -- much smaller keys have comparable security
Database of snapshots of your code
$ ls .git/
$ git init
$ git clone <git clone url>
# git@github.com:organization/reponame.git
# https://github.com/organization/reponame.git
$ git show
fatal: bad default revision 'HEAD'
# To be expected with nothing in the repo
$ git show
fatal: Not a git repository (or any of the
parent directories): .git
# not in a repo
Warning
This deletes your history. Only do it if you really want to stop having a Git repo here.
$ rm -rf .git
$ touch foo
$ git add foo
$ touch bar
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..."
to unstage)
new file: foo
Untracked files:
(use "git add <file>..." to include
in what will be committed)
bar
$ git commit --dry-run
$ git rm --cached foo
$ git reset HEAD foo
Note
next, snapshots
Note
next, commits
Snapshot of changes
Includes snapshot (with pointers to unchanged files), author, date, committer (can differ from author), parent commit
$ git commit
$ man git-commit
-a, --all
-i, --interactive
--reset-author
--date=<date> (see DATE FORMATS in man page)
--allow-empty
--amend
-o, --only
-S, --gpg-sign
Note
-o is for only files from command line disregarding the stash Specifying file names disregards staged changes, plus stages all current contents
# details on latest or specified
$ git show
# Summary of recent, or a range
$ git log
$ man gitrevisions # ranges
What about commits per file?
$ git blame <file>
$ git show
$ git show --oneline
# see PRETTY FORMATS section of
$ man git-show
# Check the GPG signature
$ git show --show-signature
# Want a GUI?
$ gitk
$ git revert <commit to revert to>
Reverting makes a revert commit.
Reversability > hiding mistakes
Another clone of more or less the same repo
(remember when we cloned to get a copy?)
$ man git-remote
$ git remote add <name> <url>
$ git config -e
# OR
$ git remote show <name>
From one of my git configs...
[remote "origin"]
url = git@github.com:monte-language/monte.git
fetch = +refs/heads/*:refs/remotes/origin/*
[remote "ed"]
url = git@github.com:edunham/monte.git
fetch = +refs/heads/*:refs/remotes/ed/*
Do you prefer text editor or commands?
$ git config -e
# delete or change remote
$ man git-remote
$ git remote rename <old> <new>
$ git remote remove <name>
...etc.
Note
"Undoing" push to remote is... trickier next: tags
$ man git-tag
$ git tag -m <msg> <tagname>
Default is lightweight tag -- just a reference for SHA-1 of latest commit
Pass -s or -u <key-id> to GPG-sign
# List all available tags
$ git tag
# List tags matching regex
$ git tag -l 'regex'
# I want this version!
$ git checkout <tag name>
$ git tag -d <tagname>
# And remove it from a remote repo
$ git push origin :refs/tags/<tagname>
A parallel path of development, starting from a commit that's in the tree
Note
Point out why the arrows are "backwards"
# track remote branch by default if one matches
$ git checkout -b <branchname>
# Shorthand for:
$ git branch <branchname> # create
$ git checkout <branchname> # check out
# Pushing a branch to a remote
$ git push <remotename> <branchname>
$ git branch
$ git show <branchname>
# delete only if fully merged
$ git branch -d
# sudo delete
$ git branch -D
# delete remote branch
$ git push <remotename> :<branchname>
# Branch you're changing
$ git checkout mywork
$ git merge master
# Merge conflicts?
$ git status
On branch mywork
You have unmerged paths.
(fix conflicts and run "git commit")
Note
COMMIT OR STASH CHANGES FIRST
<<<<<<< HEAD
This content was in mywork but not master
=======
This content was in master but not mywork
>>>>>>> master
Replace all that stuff with what the content should be.
git add the file.
Check that you've got everything with git status, then commit.
Or consider git mergetool for a graphical option.
$ git diff <commit before> <merge commit>
# before merging, see changes
$ git log ..otherbranch
$ git diff ...otherbranch
$ gitk ...otherbranch
$ git merge abort
$ git reset --keep HEAD@{1}
Changing history. Means others will have to force pull.
Note
Don't do this unless you know what you're doing... But here's how to know what you're doing.
$ git rebase -i <commit range>
HEAD~4
# last 4 commits
# Oops I forgot to pull
$ git pull --rebase
# Rebase 1a20f51..147c812 onto 1a20f51
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
Note
Make sure you have your git editor set!
I should never have done that
$ git reset --hard ORIG_HEAD
I'm stuck in a broken rebase, get me out
$ git rebase --abort
GH is not exactly Git.
Watch Linus's talk for enlightenment
Permission denied (publickey).
fatal: Could not read from remote
repository.
Please make sure you have the
correct access rights and the
repository exists.
HTTP clone prompts for username and password
SSH clone uses key from your account
Focused commits with clear commit messages
Follow project standards for branching, tagging, etc.