cory.kelly
7/25/2018 - 8:34 PM

Oh shit, git!

Git is hard: screwing up is easy, and figuring out how to fix your mistakes is fucking impossible. So here are some bad situations I've gotten myself into, and how I eventually got myself out of them in plain english

## Oh shit, I did something terribly wrong, please tell me git has a magic time machine!?!

`git reflog`
### you will see a list of every thing you've done in git, across all branches! 
### Each one has an index HEAD@{index} find the one before you broke everything.

`git reset HEAD@{index}`
### magic time machine`

## Oh shit, I committed and immediately realized I need to make one small change!

### make your change
`git add . # or add individual files`
`git commit --amend`
### follow prompts to change or keep the commit message
### now your last commit contains that change!

## Oh shit, I need to change the message on my last commit!

`git commit --amend`
### follow prompts to change the commit message

## Oh shit, I accidentally committed something to master that should have been on a brand new branch!

### create a new branch from the current state of master
`git branch some-new-branch-name`
### remove the commit from the master branch
`git reset HEAD~ --hard`
`git checkout some-new-branch-name`
### your commit lives in this branch now :)

## Oh shit, I accidentally committed to the wrong branch!

### undo the last commit, but leave the changes available
`git reset HEAD~ --soft`
`git stash`
### move to the correct branch
`git checkout name-of-the-correct-branch`
`git stash pop`
`git add . # or add individual files`
`git commit -m "your message here"`
### now your changes are on the correct branch

## Cherry Pick 

`git checkout name-of-the-correct-branch`
### grab the last commit to master
`git cherry-pick master`
### delete it from master
`git checkout master`
`git reset HEAD~ --hard`

## Oh shit, I tried to run a diff but nothing happened?!

`git diff --staged`
### Git won't do a diff of files that have been add-ed to your staging area without this flag. 

## Fuck this noise, I give up.

`cd ..`
`sudo rm -r fucking-git-repo-dir`
`git clone https://some.github.url/fucking-git-repo-dir.git`
`cd fucking-git-repo-dir`