Skip to content

Instantly share code, notes, and snippets.

@coreyfloyd
Last active December 17, 2015 13:19
Show Gist options
  • Select an option

  • Save coreyfloyd/5616318 to your computer and use it in GitHub Desktop.

Select an option

Save coreyfloyd/5616318 to your computer and use it in GitHub Desktop.

Revisions

  1. coreyfloyd revised this gist Jun 17, 2015. 1 changed file with 181 additions and 173 deletions.
    354 changes: 181 additions & 173 deletions git.txt
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    git
    current commit sha
    git rev-list --max-count=1 HEAD
    git rev-parse HEAD
    @@ -26,7 +27,7 @@ totally remove all changes since last commit
    git reset --hard

    undo last "successful" merge
    git reset --hard ORIG_HEAD
    git reset --hard ORIG\_HEAD

    Change commit message:
    git commit --amend -m "new message"
    @@ -47,6 +48,8 @@ git checkout -t origin/feature
    git checkout --track -b development origin/development
    git checkout -b stage origin/stage

    Delete all merged branches
    git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

    Setup upstream tracking
    git branch --set-upstream dev origin/dev
    @@ -61,21 +64,21 @@ git config branch.master.remote origin
    //the branch
    git config branch.master.merge master

    git remote set-url remote_name new_url
    git remote set-url remote\_name new\_url

    while merging, pick either local or remote
    git checkout --ours index.html
    git checkout --theirs _layouts/default.html
    git checkout --theirs \_layouts/default.html


    if git < 1.6.1
    if git \< 1.6.1
    ours
    git reset -- index.html
    git checkout ORIG_HEAD -- index.html
    git checkout ORIG\_HEAD -- index.html

    theirs
    git reset -- _layouts/default.html
    git checkout MERGE_HEAD -- _layouts/default.html
    git reset -- \_layouts/default.html
    git checkout MERGE\_HEAD -- \_layouts/default.html

    log a fetch
    git log -p master..origin/master
    @@ -126,9 +129,8 @@ git log --graph --oneline

    git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

    git log --graph --full-history --all --color \
    --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"

    git log --graph --full-history --all --color \\
    '' --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"

    delete untracked files from your git working copy

    @@ -147,55 +149,55 @@ Unless you specify -f and clean.requireForce is set to "true" (the default) in y
    Note that as of git-1.6.0, the dashed style of writing git commands (ie, git-clean instead of git clean) is obsoleted.

    Setup
    -----
    ----

    git clone <repo>
    clone the repository specified by <repo>; this is similar to "checkout" in
    git clone ~<repo>~
    clone the repository specified by ~<repo>~; this is similar to "checkout" in
    some other version control systems such as Subversion and CVS

    Add colors to your ~/.gitconfig file:

    [color]
    ui = auto
    [color "branch"]
    current = yellow reverse
    local = yellow
    remote = green
    [color "diff"]
    meta = yellow bold
    frag = magenta bold
    old = red bold
    new = green bold
    [color "status"]
    added = yellow
    changed = green
    untracked = cyan
    Add colors to your \~/.gitconfig file:

    \[color]
    '' ui = auto
    \[color "branch"]
    '' current = yellow reverse
    '' local = yellow
    '' remote = green
    \[color "diff"]
    '' meta = yellow bold
    '' frag = magenta bold
    '' old = red bold
    '' new = green bold
    \[color "status"]
    '' added = yellow
    '' changed = green
    '' untracked = cyan

    Highlight whitespace in diffs

    [color]
    ui = true
    [color "diff"]
    whitespace = red reverse
    [core]
    whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
    \[color]
    '' ui = true
    \[color "diff"]
    '' whitespace = red reverse
    \[core]
    '' whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol

    Add aliases to your ~/.gitconfig file:
    Add aliases to your \~/.gitconfig file:

    [alias]
    st = status
    ci = commit
    br = branch
    co = checkout
    df = diff
    lg = log -p
    \[alias]
    '' st = status
    '' ci = commit
    '' br = branch
    '' co = checkout
    '' df = diff
    '' lg = log -p


    Configuration
    -------------
    ----

    git config -e [--global]
    edit the .git/config [or ~/.gitconfig] file in your $EDITOR
    git config -e \[--global]
    edit the .git/config \[or \~/.gitconfig] file in your $EDITOR

    git config --global user.name 'John Doe'
    git config --global user.email [email protected]
    @@ -212,19 +214,19 @@ git config core.autocrlf true
    when checking out files, and to LF newlines when committing in

    You can add "--global" after "git config" to any of these commands to make it
    apply to all git repos (writes to ~/.gitconfig).
    apply to all git repos (writes to \~/.gitconfig).


    Info
    ----
    ----
    git reflog
    Use this to recover from *major* fuck ups! It's basically a log of the
    last few actions and you might have luck and find old commits that
    have been lost by doing a complex merge.

    git diff
    show a diff of the changes made since your last commit
    to diff one file: "git diff -- <filename>"
    to diff one file: "git diff -- ~<filename>~"
    to show a diff between staging area and HEAD: `git diff --cached`

    git status
    @@ -242,74 +244,74 @@ git log
    --before="MMM DD YYYY" only commits that occur before a certain date
    --merge only the commits involved in the current merge conflicts

    git log <ref>..<ref>
    git log ~<ref>~..~<ref>~
    show commits between the specified range. Useful for seeing changes from
    remotes:
    git log HEAD..origin/master # after git remote update

    git show <rev>
    show the changeset (diff) of a commit specified by <rev>, which can be any
    git show ~<rev>~
    show the changeset (diff) of a commit specified by ~<rev>~, which can be any
    SHA1 commit ID, branch name, or tag (shows the last commit (HEAD) by default)

    git show --name-only <rev>
    git show --name-only ~<rev>~
    show only the names of the files that changed, no diff information.

    git blame <file>
    show who authored each line in <file>
    git blame ~<file>~
    show who authored each line in ~<file>~

    git blame <file> <rev>
    show who authored each line in <file> as of <rev> (allows blame to go back in
    git blame ~<file>~ ~<rev>~
    show who authored each line in ~<file>~ as of ~<rev>~ (allows blame to go back in
    time)

    git gui blame
    really nice GUI interface to git blame

    git whatchanged <file>
    show only the commits which affected <file> listing the most recent first
    git whatchanged ~<file>~
    show only the commits which affected ~<file>~ listing the most recent first
    E.g. view all changes made to a file on a branch:
    git whatchanged <branch> <file> | grep commit | \
    colrm 1 7 | xargs -I % git show % <file>
    this could be combined with git remote show <remote> to find all changes on
    '' git whatchanged <branch> <file> | grep commit | \
    '' colrm 1 7 | xargs -I % git show % <file>
    this could be combined with git remote show ~<remote>~ to find all changes on
    all branches to a particular file.

    git diff <commit> head path/to/fubar
    git diff ~<commit>~ head path/to/fubar
    show the diff between a file on the current branch and potentially another
    branch

    git diff head -- <file>
    git diff head -- ~<file>~
    use this form when doing git diff on cherry-pick'ed (but not committed)
    changes
    somehow changes are not shown when using just git diff.

    Adding / Deleting
    -----------------
    ----

    git add <file1> <file2> ...
    add <file1>, <file2>, etc... to the project
    git add ~<file1>~ ~<file2>~ ...
    add ~<file1>~, ~<file2>~, etc... to the project

    git add <dir>
    add all files under directory <dir> to the project, including subdirectories
    git add ~<dir>~
    add all files under directory ~<dir>~ to the project, including subdirectories

    git add .
    add all files under the current directory to the project
    *WARNING*: including untracked files.

    git rm <file1> <file2> ...
    remove <file1>, <file2>, etc... from thgit rev-parse HEADe project
    git rm ~<file1>~ ~<file2>~ ...
    remove ~<file1>~, ~<file2>~, etc... from thgit rev-parse HEADe project

    git rm $(git ls-files --deleted)
    remove all deleted files from the project

    git rm --cached <file1> <file2> ...
    commits absence of <file1>, <file2>, etc... from the project
    git rm --cached ~<file1>~ ~<file2>~ ...
    commits absence of ~<file1>~, ~<file2>~, etc... from the project


    Staging
    -------
    ----

    git add <file1> <file2> ...
    git stage <file1> <file2> ...
    add changes in <file1>, <file2> ... to the staging area (to be included in
    git add ~<file1>~ ~<file2>~ ...
    git stage ~<file1>~ ~<file2>~ ...
    add changes in ~<file1>~, ~<file2>~ ... to the staging area (to be included in
    the next commit

    git add -p
    @@ -322,14 +324,14 @@ git stage --interactive
    interactively add files/changes to the staging area. For a simpler
    mode (no menu), try `git add --patch` (above)

    git reset HEAD <file1>
    git reset HEAD ~<file1>~
    remove changes from staging area

    Committing
    ----------
    ----

    git commit <file1> <file2> ... [-m <msg>]
    commit <file1>, <file2>, etc..., optionally using commit message <msg>,
    git commit ~<file1>~ ~<file2>~ ... \[-m ~<msg>~]
    commit ~<file1>~, ~<file2>~, etc..., optionally using commit message ~<msg>~,
    otherwise opening your editor to let you type a commit message

    git commit -a
    @@ -343,12 +345,12 @@ git commit -v
    git commit --amend
    edit the commit message of the most recent commit

    git commit --amend <file1> <file2> ...
    redo previous commit, including changes made to <file1>, <file2>, etc...
    git commit --amend ~<file1>~ ~<file2>~ ...
    redo previous commit, including changes made to ~<file1>~, ~<file2>~, etc...


    Branching
    ---------
    ----

    git branch
    list all local branches
    @@ -359,99 +361,106 @@ git branch -r
    git branch -a
    list all local and remote branches

    git branch <branch>
    create a new branch named <branch>, referencing the same point in history as
    git branch ~<branch>~
    create a new branch named ~<branch>~, referencing the same point in history as
    the current branch

    git branch <branch> <start-point>
    create a new branch named <branch>, referencing <start-point>, which may be
    git branch ~<branch>~ ~<start-point>~
    create a new branch named ~<branch>~, referencing ~<start-point>~, which may be
    specified any way you like, including using a branch name or a tag name

    git branch --track <branch> <remote-branch>
    git branch --track ~<branch>~ ~<remote-branch>~
    create a tracking branch. Will push/pull changes to/from another repository.
    Example: git branch --track experimental origin/experimental

    git branch -d <branch>
    delete the branch <branch>; if the branch you are deleting points to a commit
    git branch -d ~<branch>~
    delete the branch ~<branch>~; if the branch you are deleting points to a commit
    which is not reachable from the current branch, this command will fail with a
    warning.

    git branch -r -d <remote-branch>
    git branch -r -d ~<remote-branch>~
    delete a remote-tracking branch.
    Example: git branch -r -d wycats/master

    git branch -D <branch>
    git branch -D ~<branch>~
    even if the branch points to a commit not reachable from the current branch,
    you may know that that commit is still reachable from some other branch or
    tag. In that case it is safe to use this command to force git to delete the
    branch.

    git checkout <branch>
    make the current branch <branch>, updating the working directory to reflect
    the version referenced by <branch>
    git checkout ~<branch>~
    make the current branch ~<branch>~, updating the working directory to reflect
    the version referenced by ~<branch>~

    git checkout -b <new> <start-point>
    create a new branch <new> referencing <start-point>, and check it out.
    git checkout -b ~<new>~ ~<start-point>~
    create a new branch ~<new>~ referencing ~<start-point>~, and check it out.

    git push <repository> :<branch>
    git push ~<repository>~ :~<branch>~
    removes a branch from a remote repository.
    Example: git push origin :old_branch_to_be_deleted
    Example: git push origin :old\_branch\_to\_be\_deleted

    git co <branch> <path to new file>
    git co ~<branch>~ ~<path to new file>~
    Checkout a file from another branch and add it to this branch. File
    will still need to be added to the git branch, but it's present.
    Eg. git co remote_at_origin__tick702_antifraud_blocking
    ..../...nt_elements_for_iframe_blocked_page.rb
    Eg. git co remote\_at\_origin\_\_tick702\_antifraud\_blocking
    ..../...nt\_elements\_for\_iframe\_blocked\_page.rb

    git show <branch> -- <path to file that does not exist>
    Eg. git show remote_tick702 -- path/to/fubar.txt
    git show ~<branch>~ -- ~<path to file that does not exist>~
    Eg. git show remote\_tick702 -- path/to/fubar.txt
    show the contents of a file that was created on another branch and that
    does not exist on the current branch.

    git show <rev>:<repo path to file>
    git show ~<rev>~:~<repo path to file>~
    Show the contents of a file at the specific revision. Note: path has to be
    absolute within the repo.

    Merging
    -------
    ----

    git merge <branch>
    merge branch <branch> into the current branch; this command is idempotent and
    git merge ~<branch>~
    merge branch ~<branch>~ into the current branch; this command is idempotent and
    can be run as many times as needed to keep the current branch up-to-date with
    changes in <branch>
    changes in ~<branch>~

    git merge <branch> --no-commit
    merge branch <branch> into the current branch, but do not autocommit the
    git merge ~<branch>~ --no-commit
    merge branch ~<branch>~ into the current branch, but do not autocommit the
    result; allows you to make further tweaks

    git merge <branch> -s ours
    merge branch <branch> into the current branch, but drops any changes in
    <branch>, using the current tree as the new tree
    git merge ~<branch>~ -s ours
    merge branch ~<branch>~ into the current branch, but drops any changes in
    ~<branch>~, using the current tree as the new tree


    Cherry-Picking
    --------------
    ----

    git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] <commit>
    git cherry-pick \[--edit] \[-n] \[-m parent-number] \[-s] \[-x] ~<commit>~
    selectively merge a single commit from another local branch
    Example: git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544

    cherry pick multiple commits > 1.7.2
    cherry pick multiple commits \> 1.7.2
    git cherry-pick 7beeb53dcc02c394c16087ee7eb8b5b9a2d98c54^..636df796280149ee62eb3a3a5dd8ee2683e8536b
    git cherry-pick old^..new


    Squashing
    ---------
    Rebasing
    ----

    WARNING: "git rebase" changes history. Be careful. Google it.

    git rebase --interactive HEAD~10
    Squash
    git rebase --interactive HEAD\~10
    (then change all but the first "pick" to "squash")
    squash the last 10 commits into one big commit

    Rebase the current branch onto master
    git rebase master

    Rebase part of the current branch onto master, starting on the commit following old-base (old-base can be any ref)
    git rebase --onto master old-base

    Conflicts
    ---------
    ----

    git mergetool
    work through conflicted files by opening them in your mergetool (opendiff,
    @@ -461,23 +470,23 @@ git mergetool
    For binary files or if mergetool won't do, resolve the conflict(s) manually and
    then do:

    git add <file1> [<file2> ...]
    git add ~<file1>~ \[~<file2>~ ...]

    Once all conflicts are resolved and staged, commit the pending merge with:

    git commit


    Sharing
    -------
    ----

    git fetch <remote>
    update the remote-tracking branches for <remote> (defaults to "origin").
    git fetch ~<remote>~
    update the remote-tracking branches for ~<remote>~ (defaults to "origin").
    Does not initiate a merge into the current branch (see "git pull" below).

    git pull
    fetch changes from the server, and merge them into the current branch.
    Note: .git/config must have a [branch "some_name"] section for the current
    Note: .git/config must have a \[branch "some\_name"] section for the current
    branch, to know which remote-tracking branch to merge into the current
    branch. Git 1.5.3 and above adds this automatically.

    @@ -486,26 +495,26 @@ git push
    between your local copy and the server. Local branches that were never pushed
    to the server in the first place are not shared.

    git push origin <branch>
    update the server with your commits made to <branch> since your last push.
    git push origin ~<branch>~
    update the server with your commits made to ~<branch>~ since your last push.
    This is always *required* for new branches that you wish to share. After the
    first explicit push, "git push" by itself is sufficient.

    git push origin <branch>:refs/heads/<branch>
    git push origin ~<branch>~:refs/heads/~<branch>~
    E.g. git push origin twitter-experiment:refs/heads/twitter-experiment
    Which, in fact, is the same as git push origin <branch> but a little
    Which, in fact, is the same as git push origin ~<branch>~ but a little
    more obvious what is happening.

    Reverting
    ---------
    ----

    git revert <rev>
    reverse commit specified by <rev> and commit the result. This does *not* do
    git revert ~<rev>~
    reverse commit specified by ~<rev>~ and commit the result. This does *not* do
    the same thing as similarly named commands in other VCS's such as "svn revert"
    or "bzr revert", see below

    git checkout <file>
    re-checkout <file>, overwriting any local changes
    git checkout ~<file>~
    re-checkout ~<file>~, overwriting any local changes

    git checkout .
    re-checkout all files, overwriting any local changes. This is most similar to
    @@ -515,14 +524,14 @@ revert a merge commit:
    git revert -m 1 sha

    Fix mistakes / Undo
    -------------------
    ----

    git reset --hard
    abandon everything since your last commit; this command can be DANGEROUS. If
    merging has resulted in conflicts and you'd like to just forget about the
    merge, this command will do that.

    git reset --hard ORIG_HEAD
    git reset --hard ORIG\_HEAD
    undo your most recent *successful* merge *and* any changes that occurred
    after. Useful for forgetting about the merge you just did. If there are
    conflicts (the merge was not successful), use "git reset --hard" (above)
    @@ -538,17 +547,17 @@ git commit --amend


    Plumbing
    --------
    ----

    test <sha1-A> = $(git merge-base <sha1-A> <sha1-B>)
    test ~<sha1-A>~ = $(git merge-base ~<sha1-A>~ ~<sha1-B>~)
    determine if merging sha1-B into sha1-A is achievable as a fast forward;
    non-zero exit status is false.


    Stashing
    --------
    ----

    git stash save <optional-name>
    git stash save ~<optional-name>~
    save your local modifications to a new stash (so you can for example
    "git svn rebase" or "git pull")

    @@ -563,99 +572,98 @@ git stash pop
    git stash list
    list all current stashes

    git stash show <stash-name> -p
    git stash show ~<stash-name>~ -p
    show the contents of a stash - accepts all diff args

    git stash clear
    delete current stashes


    Remotes
    -------
    ----

    git remote add <remote> <remote_URL>
    git remote add ~<remote>~ \<remote\_URL\>
    adds a remote repository to your git config. Can be then fetched locally.
    Example:
    git remote add coreteam git://github.com/wycats/merb-plugins.git
    git fetch coreteam
    '' git remote add coreteam git://github.com/wycats/merb-plugins.git
    '' git fetch coreteam

    git push <remote> :refs/heads/<branch>
    git push ~<remote>~ :refs/heads/~<branch>~
    delete a branch in a remote repository

    git push <remote> <remote>:refs/heads/<remote_branch>
    git push ~<remote>~ ~<remote>~:refs/heads/\<remote\_branch\>
    create a branch on a remote repository
    Example: git push origin origin:refs/heads/new_feature_name
    Example: git push origin origin:refs/heads/new\_feature\_name

    git push <repository> +<remote>:<new_remote>
    create a branch on a remote repository based on +<remote>
    Example: git push origin +master:my_branch
    git push ~<repository>~ +~<remote>~:\<new\_remote\>
    create a branch on a remote repository based on +~<remote>~
    Example: git push origin +master:my\_branch

    git remote prune <remote>
    git remote prune ~<remote>~
    prune deleted remote-tracking branches from "git branch -r" listing

    git remote add -t master -m master origin git://example.com/git.git/
    add a remote and track its master

    git remote show <remote>
    git remote show ~<remote>~
    show information about the remote server.

    git checkout -b <local branch> <remote>/<remote branch>
    git checkout -b ~<local branch>~ ~<remote>~/~<remote branch>~
    Eg git checkout -b myfeature origin/myfeature
    Track a remote branch as a local branch.

    git pull <remote> <branch>
    git pull ~<remote>~ ~<branch>~
    git push
    For branches that are remotely tracked (via git push) but
    that complain about non-fast forward commits when doing a
    git push. The pull synchronizes local and remote, and if
    all goes well, the result is pushable.

    Submodules
    ----------
    ----

    git submodule add <remote_repository> <path/to/submodule>
    git submodule add \<remote\_repository\> \<path/to/submodule\>
    add the given repository at the given path. The addition will be part of the
    next commit.

    git submodule update [--init]
    git submodule update \[--init]
    Update the registered submodules (clone missing submodules, and checkout
    the commit specified by the super-repo). --init is needed the first time.

    git submodule foreach <command>
    git submodule foreach ~<command>~
    Executes the given command within each checked out submodule.

    Remove submodules

    1. Delete the relevant line from the .gitmodules file.
    2. Delete the relevant section from .git/config.
    3. Run git rm --cached path_to_submodule (no trailing slash).
    3. Run git rm --cached path\_to\_submodule (no trailing slash).
    4. Commit and delete the now untracked submodule files.

    pull all
    git submodule foreach 'git pull origin master'

    Git Instaweb
    ------------
    ----

    git instaweb --httpd=webrick [--start | --stop | --restart]
    git instaweb --httpd=webrick \[--start | --stop | --restart]


    Environment Variables
    ---------------------
    ----

    GIT_AUTHOR_NAME, GIT_COMMITTER_NAME
    GIT\_AUTHOR\_NAME, GIT\_COMMITTER\_NAME
    Your full name to be recorded in any newly created commits. Overrides
    user.name in .git/config

    GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAIL
    GIT\_AUTHOR\_EMAIL, GIT\_COMMITTER\_EMAIL
    Your email address to be recorded in any newly created commits. Overrides
    user.email in .git/config

    GIT_DIR
    GIT\_DIR
    Location of the repository to use (for out of working directory repositories)

    GIT_WORKING_TREE
    Location of the Working Directory - use with GIT_DIR to specifiy the working
    GIT\_WORKING\_TREE
    Location of the Working Directory - use with GIT\_DIR to specifiy the working
    directory root
    or to work without being in the working directory at all.

    or to work without being in the working directory at all.
  2. coreyfloyd revised this gist Jul 19, 2013. 1 changed file with 12 additions and 1 deletion.
    13 changes: 12 additions & 1 deletion git.txt
    Original file line number Diff line number Diff line change
    @@ -5,6 +5,12 @@ git rev-parse HEAD
    keep added files after stash
    git stash --keep-index

    only stash un-added files
    git stash -k

    delete untracked file
    git clean -f

    revert file:
    git checkout HEAD path/to/file
    OR
    @@ -28,15 +34,20 @@ git commit --amend -m "new message"
    Add current changes to last commit
    git commit --amend

    Commit without hooks
    git commit -n

    git checkout hash path/to/deleted/file

    All new branches will track remote counterparts automatically:
    git config branch.autosetupmerge true

    Checkout a new tracking branch
    git checkout -t origin/feature
    git checkout --track -b development origin/development
    git checkout -b stage origin/stage


    Setup upstream tracking
    git branch --set-upstream dev origin/dev

    @@ -99,7 +110,7 @@ git remote rm origin
    stop tracking remote branch (delete remotes/nameOfBranch)
    git branch -rd remoteBranch

    delete remote branch (on server)
    delete remote branch (on server)del
    git push origin :newfeature

    git config --global user.email [email protected]
  3. coreyfloyd revised this gist May 20, 2013. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions git.txt
    Original file line number Diff line number Diff line change
    @@ -42,6 +42,7 @@ git branch --set-upstream dev origin/dev

    Force push even if non fast forward
    git push origin +master:master
    git push -f origin master

    setup pull/merge for master
    //the repo
  4. coreyfloyd created this gist May 20, 2013.
    649 changes: 649 additions & 0 deletions git.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,649 @@
    current commit sha
    git rev-list --max-count=1 HEAD
    git rev-parse HEAD

    keep added files after stash
    git stash --keep-index

    revert file:
    git checkout HEAD path/to/file
    OR
    git checkout filename

    pluck one file from another branch
    git checkout Branch path/to/file

    undo last commit, leave previous changes staged in index
    git reset --soft HEAD^

    totally remove all changes since last commit
    git reset --hard

    undo last "successful" merge
    git reset --hard ORIG_HEAD

    Change commit message:
    git commit --amend -m "new message"

    Add current changes to last commit
    git commit --amend

    git checkout hash path/to/deleted/file

    All new branches will track remote counterparts automatically:
    git config branch.autosetupmerge true

    Checkout a new tracking branch
    git checkout --track -b development origin/development
    git checkout -b stage origin/stage

    Setup upstream tracking
    git branch --set-upstream dev origin/dev

    Force push even if non fast forward
    git push origin +master:master

    setup pull/merge for master
    //the repo
    git config branch.master.remote origin
    //the branch
    git config branch.master.merge master

    git remote set-url remote_name new_url

    while merging, pick either local or remote
    git checkout --ours index.html
    git checkout --theirs _layouts/default.html


    if git < 1.6.1
    ours
    git reset -- index.html
    git checkout ORIG_HEAD -- index.html

    theirs
    git reset -- _layouts/default.html
    git checkout MERGE_HEAD -- _layouts/default.html

    log a fetch
    git log -p master..origin/master

    push tags
    git push --tags

    tag
    git tag -a -m "Version 1.0 release, submitted to app store Jan 16 2010" v1.0

    list tags
    git tag -l -n

    git diff
    git diff "filename"

    git difftool
    git difftool "filename"

    set difftool
    git config --global difftool.opendiff.cmd

    no prompt
    git config --global difftool.prompt false

    add remote
    git remote add origin [email protected]:coreyfloyd/mobilecause-carousel.git

    remove remote
    git remote rm origin

    stop tracking remote branch (delete remotes/nameOfBranch)
    git branch -rd remoteBranch

    delete remote branch (on server)
    git push origin :newfeature

    git config --global user.email [email protected]

    after editing git ignore, remove all ignored files from index:
    git rm -r --cached .
    git add .
    git commit -m ".gitignore is now working"

    git log --graph --all

    git log --graph --oneline

    git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

    git log --graph --full-history --all --color \
    --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"


    delete untracked files from your git working copy

    git clean -f

    If you want to also remove directories, run git clean -f -d.

    If you just want to remove ignored files, run git clean -f -X.

    If you want to remove ignored as well as non-ignored files, run git clean -f -x.

    Note the case difference on the X for the two latter commands.

    Unless you specify -f and clean.requireForce is set to "true" (the default) in your configuration, nothing will actually happen, with a recent enough version of git.

    Note that as of git-1.6.0, the dashed style of writing git commands (ie, git-clean instead of git clean) is obsoleted.

    Setup
    -----

    git clone <repo>
    clone the repository specified by <repo>; this is similar to "checkout" in
    some other version control systems such as Subversion and CVS

    Add colors to your ~/.gitconfig file:

    [color]
    ui = auto
    [color "branch"]
    current = yellow reverse
    local = yellow
    remote = green
    [color "diff"]
    meta = yellow bold
    frag = magenta bold
    old = red bold
    new = green bold
    [color "status"]
    added = yellow
    changed = green
    untracked = cyan

    Highlight whitespace in diffs

    [color]
    ui = true
    [color "diff"]
    whitespace = red reverse
    [core]
    whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol

    Add aliases to your ~/.gitconfig file:

    [alias]
    st = status
    ci = commit
    br = branch
    co = checkout
    df = diff
    lg = log -p


    Configuration
    -------------

    git config -e [--global]
    edit the .git/config [or ~/.gitconfig] file in your $EDITOR

    git config --global user.name 'John Doe'
    git config --global user.email [email protected]
    sets your name and email for commit messages

    git config branch.autosetupmerge true
    tells git-branch and git-checkout to setup new branches so that git-pull(1)
    will appropriately merge from that remote branch. Recommended. Without this,
    you will have to add --track to your branch subcommand or manually merge remote
    tracking branches with "fetch" and then "merge".

    git config core.autocrlf true
    This setting tells git to convert the newlines to the system’s standard
    when checking out files, and to LF newlines when committing in

    You can add "--global" after "git config" to any of these commands to make it
    apply to all git repos (writes to ~/.gitconfig).


    Info
    ----
    git reflog
    Use this to recover from *major* fuck ups! It's basically a log of the
    last few actions and you might have luck and find old commits that
    have been lost by doing a complex merge.

    git diff
    show a diff of the changes made since your last commit
    to diff one file: "git diff -- <filename>"
    to show a diff between staging area and HEAD: `git diff --cached`

    git status
    show files added to the staging area, files with changes, and untracked files

    git log
    show recent commits, most recent on top. Useful options:
    --color with color
    --graph with an ASCII-art commit graph on the left
    --decorate with branch and tag names on appropriate commits
    --stat with stats (files changed, insertions, and deletions)
    -p with full diffs
    --author=foo only by a certain author
    --after="MMM DD YYYY" ex. ("Jun 20 2008") only commits after a certain date
    --before="MMM DD YYYY" only commits that occur before a certain date
    --merge only the commits involved in the current merge conflicts

    git log <ref>..<ref>
    show commits between the specified range. Useful for seeing changes from
    remotes:
    git log HEAD..origin/master # after git remote update

    git show <rev>
    show the changeset (diff) of a commit specified by <rev>, which can be any
    SHA1 commit ID, branch name, or tag (shows the last commit (HEAD) by default)

    git show --name-only <rev>
    show only the names of the files that changed, no diff information.

    git blame <file>
    show who authored each line in <file>

    git blame <file> <rev>
    show who authored each line in <file> as of <rev> (allows blame to go back in
    time)

    git gui blame
    really nice GUI interface to git blame

    git whatchanged <file>
    show only the commits which affected <file> listing the most recent first
    E.g. view all changes made to a file on a branch:
    git whatchanged <branch> <file> | grep commit | \
    colrm 1 7 | xargs -I % git show % <file>
    this could be combined with git remote show <remote> to find all changes on
    all branches to a particular file.

    git diff <commit> head path/to/fubar
    show the diff between a file on the current branch and potentially another
    branch

    git diff head -- <file>
    use this form when doing git diff on cherry-pick'ed (but not committed)
    changes
    somehow changes are not shown when using just git diff.

    Adding / Deleting
    -----------------

    git add <file1> <file2> ...
    add <file1>, <file2>, etc... to the project

    git add <dir>
    add all files under directory <dir> to the project, including subdirectories

    git add .
    add all files under the current directory to the project
    *WARNING*: including untracked files.

    git rm <file1> <file2> ...
    remove <file1>, <file2>, etc... from thgit rev-parse HEADe project

    git rm $(git ls-files --deleted)
    remove all deleted files from the project

    git rm --cached <file1> <file2> ...
    commits absence of <file1>, <file2>, etc... from the project


    Staging
    -------

    git add <file1> <file2> ...
    git stage <file1> <file2> ...
    add changes in <file1>, <file2> ... to the staging area (to be included in
    the next commit

    git add -p
    git stage --patch
    interactively walk through the current changes (hunks) in the working
    tree, and decide which changes to add to the staging area.

    git add -i
    git stage --interactive
    interactively add files/changes to the staging area. For a simpler
    mode (no menu), try `git add --patch` (above)

    git reset HEAD <file1>
    remove changes from staging area

    Committing
    ----------

    git commit <file1> <file2> ... [-m <msg>]
    commit <file1>, <file2>, etc..., optionally using commit message <msg>,
    otherwise opening your editor to let you type a commit message

    git commit -a
    commit all files changed since your last commit
    (does not include new (untracked) files)

    git commit -v
    commit verbosely, i.e. includes the diff of the contents being committed in
    the commit message screen

    git commit --amend
    edit the commit message of the most recent commit

    git commit --amend <file1> <file2> ...
    redo previous commit, including changes made to <file1>, <file2>, etc...


    Branching
    ---------

    git branch
    list all local branches

    git branch -r
    list all remote branches

    git branch -a
    list all local and remote branches

    git branch <branch>
    create a new branch named <branch>, referencing the same point in history as
    the current branch

    git branch <branch> <start-point>
    create a new branch named <branch>, referencing <start-point>, which may be
    specified any way you like, including using a branch name or a tag name

    git branch --track <branch> <remote-branch>
    create a tracking branch. Will push/pull changes to/from another repository.
    Example: git branch --track experimental origin/experimental

    git branch -d <branch>
    delete the branch <branch>; if the branch you are deleting points to a commit
    which is not reachable from the current branch, this command will fail with a
    warning.

    git branch -r -d <remote-branch>
    delete a remote-tracking branch.
    Example: git branch -r -d wycats/master

    git branch -D <branch>
    even if the branch points to a commit not reachable from the current branch,
    you may know that that commit is still reachable from some other branch or
    tag. In that case it is safe to use this command to force git to delete the
    branch.

    git checkout <branch>
    make the current branch <branch>, updating the working directory to reflect
    the version referenced by <branch>

    git checkout -b <new> <start-point>
    create a new branch <new> referencing <start-point>, and check it out.

    git push <repository> :<branch>
    removes a branch from a remote repository.
    Example: git push origin :old_branch_to_be_deleted

    git co <branch> <path to new file>
    Checkout a file from another branch and add it to this branch. File
    will still need to be added to the git branch, but it's present.
    Eg. git co remote_at_origin__tick702_antifraud_blocking
    ..../...nt_elements_for_iframe_blocked_page.rb

    git show <branch> -- <path to file that does not exist>
    Eg. git show remote_tick702 -- path/to/fubar.txt
    show the contents of a file that was created on another branch and that
    does not exist on the current branch.

    git show <rev>:<repo path to file>
    Show the contents of a file at the specific revision. Note: path has to be
    absolute within the repo.

    Merging
    -------

    git merge <branch>
    merge branch <branch> into the current branch; this command is idempotent and
    can be run as many times as needed to keep the current branch up-to-date with
    changes in <branch>

    git merge <branch> --no-commit
    merge branch <branch> into the current branch, but do not autocommit the
    result; allows you to make further tweaks

    git merge <branch> -s ours
    merge branch <branch> into the current branch, but drops any changes in
    <branch>, using the current tree as the new tree


    Cherry-Picking
    --------------

    git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] <commit>
    selectively merge a single commit from another local branch
    Example: git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544

    cherry pick multiple commits > 1.7.2
    git cherry-pick 7beeb53dcc02c394c16087ee7eb8b5b9a2d98c54^..636df796280149ee62eb3a3a5dd8ee2683e8536b
    git cherry-pick old^..new


    Squashing
    ---------
    WARNING: "git rebase" changes history. Be careful. Google it.

    git rebase --interactive HEAD~10
    (then change all but the first "pick" to "squash")
    squash the last 10 commits into one big commit


    Conflicts
    ---------

    git mergetool
    work through conflicted files by opening them in your mergetool (opendiff,
    kdiff3, etc.) and choosing left/right chunks. The merged result is staged for
    commit.

    For binary files or if mergetool won't do, resolve the conflict(s) manually and
    then do:

    git add <file1> [<file2> ...]

    Once all conflicts are resolved and staged, commit the pending merge with:

    git commit


    Sharing
    -------

    git fetch <remote>
    update the remote-tracking branches for <remote> (defaults to "origin").
    Does not initiate a merge into the current branch (see "git pull" below).

    git pull
    fetch changes from the server, and merge them into the current branch.
    Note: .git/config must have a [branch "some_name"] section for the current
    branch, to know which remote-tracking branch to merge into the current
    branch. Git 1.5.3 and above adds this automatically.

    git push
    update the server with your commits across all branches that are *COMMON*
    between your local copy and the server. Local branches that were never pushed
    to the server in the first place are not shared.

    git push origin <branch>
    update the server with your commits made to <branch> since your last push.
    This is always *required* for new branches that you wish to share. After the
    first explicit push, "git push" by itself is sufficient.

    git push origin <branch>:refs/heads/<branch>
    E.g. git push origin twitter-experiment:refs/heads/twitter-experiment
    Which, in fact, is the same as git push origin <branch> but a little
    more obvious what is happening.

    Reverting
    ---------

    git revert <rev>
    reverse commit specified by <rev> and commit the result. This does *not* do
    the same thing as similarly named commands in other VCS's such as "svn revert"
    or "bzr revert", see below

    git checkout <file>
    re-checkout <file>, overwriting any local changes

    git checkout .
    re-checkout all files, overwriting any local changes. This is most similar to
    "svn revert" if you're used to Subversion commands

    revert a merge commit:
    git revert -m 1 sha

    Fix mistakes / Undo
    -------------------

    git reset --hard
    abandon everything since your last commit; this command can be DANGEROUS. If
    merging has resulted in conflicts and you'd like to just forget about the
    merge, this command will do that.

    git reset --hard ORIG_HEAD
    undo your most recent *successful* merge *and* any changes that occurred
    after. Useful for forgetting about the merge you just did. If there are
    conflicts (the merge was not successful), use "git reset --hard" (above)
    instead.

    git reset --soft HEAD^
    forgot something in your last commit? That's easy to fix. Undo your last
    commit, but keep the changes in the staging area for editing.

    git commit --amend
    redo previous commit, including changes you've staged in the meantime.
    Also used to edit commit message of previous commit.


    Plumbing
    --------

    test <sha1-A> = $(git merge-base <sha1-A> <sha1-B>)
    determine if merging sha1-B into sha1-A is achievable as a fast forward;
    non-zero exit status is false.


    Stashing
    --------

    git stash save <optional-name>
    save your local modifications to a new stash (so you can for example
    "git svn rebase" or "git pull")

    git stash apply
    restore the changes recorded in the stash on top of the current working tree
    state

    git stash pop
    restore the changes from the most recent stash, and remove it from the stack
    of stashed changes

    git stash list
    list all current stashes

    git stash show <stash-name> -p
    show the contents of a stash - accepts all diff args

    git stash clear
    delete current stashes


    Remotes
    -------

    git remote add <remote> <remote_URL>
    adds a remote repository to your git config. Can be then fetched locally.
    Example:
    git remote add coreteam git://github.com/wycats/merb-plugins.git
    git fetch coreteam

    git push <remote> :refs/heads/<branch>
    delete a branch in a remote repository

    git push <remote> <remote>:refs/heads/<remote_branch>
    create a branch on a remote repository
    Example: git push origin origin:refs/heads/new_feature_name

    git push <repository> +<remote>:<new_remote>
    create a branch on a remote repository based on +<remote>
    Example: git push origin +master:my_branch

    git remote prune <remote>
    prune deleted remote-tracking branches from "git branch -r" listing

    git remote add -t master -m master origin git://example.com/git.git/
    add a remote and track its master

    git remote show <remote>
    show information about the remote server.

    git checkout -b <local branch> <remote>/<remote branch>
    Eg git checkout -b myfeature origin/myfeature
    Track a remote branch as a local branch.

    git pull <remote> <branch>
    git push
    For branches that are remotely tracked (via git push) but
    that complain about non-fast forward commits when doing a
    git push. The pull synchronizes local and remote, and if
    all goes well, the result is pushable.

    Submodules
    ----------

    git submodule add <remote_repository> <path/to/submodule>
    add the given repository at the given path. The addition will be part of the
    next commit.

    git submodule update [--init]
    Update the registered submodules (clone missing submodules, and checkout
    the commit specified by the super-repo). --init is needed the first time.

    git submodule foreach <command>
    Executes the given command within each checked out submodule.

    Remove submodules

    1. Delete the relevant line from the .gitmodules file.
    2. Delete the relevant section from .git/config.
    3. Run git rm --cached path_to_submodule (no trailing slash).
    4. Commit and delete the now untracked submodule files.

    pull all
    git submodule foreach 'git pull origin master'

    Git Instaweb
    ------------

    git instaweb --httpd=webrick [--start | --stop | --restart]


    Environment Variables
    ---------------------

    GIT_AUTHOR_NAME, GIT_COMMITTER_NAME
    Your full name to be recorded in any newly created commits. Overrides
    user.name in .git/config

    GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAIL
    Your email address to be recorded in any newly created commits. Overrides
    user.email in .git/config

    GIT_DIR
    Location of the repository to use (for out of working directory repositories)

    GIT_WORKING_TREE
    Location of the Working Directory - use with GIT_DIR to specifiy the working
    directory root
    or to work without being in the working directory at all.