Skip to content

Instantly share code, notes, and snippets.

@gotofritz
Last active August 22, 2017 18:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gotofritz/f8a307cd6d20f12db6cb366e18bc148f to your computer and use it in GitHub Desktop.
Save gotofritz/f8a307cd6d20f12db6cb366e18bc148f to your computer and use it in GitHub Desktop.
Git bits and pieces
# Bulk Resolve Conflics
# Changing username after a commit
# Compare Versions
# Delete A Branch
# Empty Dirs
# Get Info
# Ignore A File That Was Already Pushed
# Log With Actual Changes
# Log With List Of Files
# Move Commits To Another Branch
# Remove Added
# Squash Commits
# Sync
# Undo A Commit
# Which Branch Contains Commit
# after your pull creates a lot of conflincts, if you just want to accept other devs' changes
grep -lr '<<<<<<<' . | xargs git checkout --theirs
# You have pushed some changes, do git log and then noticed that your username is all wrong
> git log
commit 174042a6944536e3908d76dc8ad51c8d354910f3
Author: that cowboy <that@cowboy.com>
blah blah
# Open ~/.gitconfig - there should be a section for the username. If not, add one
[user]
name = John Wayne
# change the commit
# bonus points: you can also change the message (but don't have to)
git commit --amend
# push again
git push -f
> git log
commit 174042a6944536e3908d76dc8ad51c8d354910f3
Author: John Wayne <that@cowboy.com>
blah blah
# 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
# 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 safely a PUSHED commit
# what it actually does is create a commit which undoes commit hash
git revert <HASH>
# the same for a range of commits
git revert <HASH BEFORE the first>..<last HASH>
# nukes a PUSHED commit
# there'll be mayhem if someone has pulled the commit being nuked
git reset <HASH>
git push -f
# 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