Skip to content

Instantly share code, notes, and snippets.

@gotofritz
Last active August 22, 2017 18:33
Show Gist options
  • Select an option

  • Save gotofritz/f8a307cd6d20f12db6cb366e18bc148f to your computer and use it in GitHub Desktop.

Select an option

Save gotofritz/f8a307cd6d20f12db6cb366e18bc148f to your computer and use it in GitHub Desktop.
Git bits and pieces
# all the commands below also work with difftool instead of diff
# compares two commits of a file
git diff <commit> <commit> <file>
# compares two commits of a file and ignore whitespace
git diff -w <commit> <commit> <file>
# compares current state with two commits ago
git diff HEAD^^ HEAD <file>
# compares stae of all js files in <dir> with that three commits ago
# note that often this doesn't work because the $(find..) returns
# too long a string
git diff HEAD HEAD^^^ -- $(find <dir> -name '*.js')
# compares head with all commits since 01/01/16
git diff @{2016-01-01} <file>
# delete a branch locally
git branch -d BRANCH
# force delete a branch locally
git branch -D BRANCH
# delete a branch remotely
git push origin --delete BRANCH
# you can't have empty dirs in git. The best you can do is to have a .keep or .gitignore or README.md file in there
# tells you name of current branch
git rev-parse --abbrev-ref HEAD
# tells you hash of last commit
git rev-parse HEAD
# remove filename, a file already pushed, from git without deleting file
git rm --cached filename
# afterwards, add to .gitignore
# from http://stackoverflow.com/a/5493663/345007
# --follow deals with name changes
# -p does whole diffs
# -- stops input and treats rest as arguments (i.e., filenames)
git log --follow -p -- file
# finds what files where changed in a specific commit
# --stat: list of files
# --pretty=oneline: makes output terse
# -n 1: just the one commit
git log --stat --pretty=oneline -n 1[hash]
# You work on master, then after a while you realize you should have worked in a branch.
# You want to move the last X commits to a branch and remove them from master
# commit what you got, even if it doesn't work
git commit -m "work in progress, doesn't work" -a
# create the new branch - it will have everything master has
git checkout -b MY_NEW_BRANCH
# go back to master and remove the extra commits
# be extra careful if other people have pushed / pulled
git checkout master
git reset --hard HASH_OF_COMMIT # or HEAD^ if you just want to undo the last commit
# or HEAD~3 if you just want to undo the last 3 commits
git push --force origin master
# now carry on working on new branch
git checkout MY_NEW_BRANCH
# if you had commit things that did not work, uncommit, keeping the changes on your filesystem
git reset HEAD^
# ...do work...
# commit working files
git commit -m "now it works" -a
# push it to the remote
git push origin MY_NEW_BRANCH
# removes files added to git by mistake but not pushed, for example node_modules/
git rm --cached debug.log
git rm --cached -r node_modules
# after your pull creates a lot of conflincts, if you just want to accept other devs' changes
grep -lr '<<<<<<<' . | xargs git checkout --theirs
# from http://stackoverflow.com/questions/5189560/squash-my-last-x-commits-together-using-git#5189600
# undo last X commits, and commit with a new message as one
git reset --soft HEAD~X
git commit -a -m "COMMIT MESSAGE"
# undo last X commits, and commit with old messages
git reset --soft HEAD~X
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
# the kosher way of doing previous example
git rebase -i <sha-of-last-commit-BEFORE-the-ones-you-are-after>
(this will open an editor window, where you have to manually change all the "pick" except the first one to "squash")
# undo the undo - if you change your mind
git reflog
> 54439b8 HEAD@{0}: reset: moving to HEAD~1
> 6fd9bfa HEAD@{1}: commit: YOUR COMMIT MESSAGE
> ...
git reset HEAD@{1}
# or
git reset 6fd9bfa
function git-sync {
# Checks name of current branch
repo=`git rev-parse --abbrev-ref HEAD`
# If this is a fork, there must be an 'original' (in git jargon an 'upstream') somewhere.
# This assumes the git upstream was set with `git remote add upstream git@xxxx`
# And that the master is used to sync with upstream, with everyone working on branches
git checkout master && git pull origin master && git fetch upstream && git merge upstream/master && git push origin master
# If you were in a branch, go back to it, and merge what you have just fetched
if [ '$repo' != 'master' ]; then
git checkout $repo && git merge origin master && git push origin $repo
fi
git status
}
# syntax:
# HEAD~ == HEAD^ == 1 commit back
# HEAD~2 == HEAD^^ == 2 commits back
# etc
# rolls back a LOCAL commit leaving all files intact
# after that you have to git add files again, then git commit
git reset HEAD~
# rolls back a LOCAL commit leaving all files intact
# after that you can do git commit immediately
git reset --soft HEAD~
# rolls back a LOCAL commit and all traces of it
git reset --hard HEAD~
# restoring a commit destroyed with git reset --hard
git reflog
# find the hash you are interested in
git checkout -b aBranch <HASH>
# undoes a PUSHED commit
# note that HEAD is really HEAD^
# and HEAD^ is equal to HEAD^^ ...
git reset HEAD
# list branches which contains a commit
git branch --contains <commit>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment