ohshitgit.com Open in urlscan Pro
104.198.14.52  Public Scan

Submitted URL: http://upx.netlify.app/
Effective URL: https://ohshitgit.com/
Submission: On August 22 via api from US — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

Hi there! You can get this same content without swears at dangitgit.com
View in other languages
 * afrikaans (af)
 * বাংলা (bn)
 * česky (cs)
 * deutsch (de)
 * español (es)
 * persian (fa)
 * suomi (fi)
 * français (fr)
 * ελληνικά (gr)
 * עברית (he)
 * हिन्दी (hi)
 * bahasa indonesia (id)
 * italiano (it)
 * 日本語 (ja)
 * kazakh (kk)
 * 한국어 (ko)
 * नेपाली (ne)
 * nederlands (nl)
 * polski (pl)
 * português brasileiro (pt_BR)
 * romana (ro)
 * русский (ru)
 * serbia (sr)
 * swedish (sv)
 * ภาษาไทย (th)
 * Türkçe (tr)
 * українська (ua)
 * 中文 (zh)


OH SHIT, GIT!?!

Your new development career awaits. Check out the latest listings. ads via
Carbon

Git is hard: screwing up is easy, and figuring out how to fix your mistakes is
fucking impossible. Git documentation has this chicken and egg problem where you
can't search for how to get yourself out of a mess, unless you already know the
name of the thing you need to know about in order to fix your problem.

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

You can use this to get back stuff you accidentally deleted, or just to remove
some stuff you tried that broke the repo, or to recover after a bad merge, or
just to go back to a time when things actually worked. I use reflog A LOT. Mega
hat tip to the many many many many many people who suggested adding it!


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 --no-edit
# now your last commit contains that change!
# WARNING: never amend public commits

This usually happens to me if I commit, then run tests/linters... and FML, I
didn't put a space after an equals sign. You could also make the change as a new
commit and then do rebase -i in order to squash them both together, but this is
about a million times faster.

Warning: You should never amend commits that have been pushed up to a
public/shared branch! Only amend commits that only exist in your local copy or
you're gonna have a bad time.


OH SHIT, I NEED TO CHANGE THE MESSAGE ON MY LAST COMMIT!

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

Stupid commit message formatting requirements.


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 last commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# your commit lives in this branch now :)

Note: this doesn't work if you've already pushed the commit to a public/shared
branch, and if you tried other things first, you might need to git reset
HEAD@{number-of-commits-back} instead of HEAD~. Infinite sadness. Also, many
many many people suggested an awesome way to make this shorter that I didn't
know myself. Thank you all!


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

A lot of people have suggested using cherry-pick for this situation too, so take
your pick on whatever one makes the most sense to you!

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?!

If you know that you made changes to files, but diff is empty, you probably
add-ed your files to staging and you need to use a special flag.

git diff --staged

File under ¯\_(ツ)_/¯ (yes, I know this is a feature, not a bug, but it's fucking
baffling and non-obvious the first time it happens to you!)


OH SHIT, I NEED TO UNDO A COMMIT FROM LIKE 5 COMMITS AGO!

# find the commit you need to undo
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git revert [saved hash]
# git will create a new commit that undoes that commit
# follow prompts to edit the commit message
# or just save and commit

Turns out you don't have to track down and copy-paste the old file contents into
the existing file in order to undo changes! If you committed a bug, you can undo
the commit all in one go with revert.

You can also revert a single file instead of a full commit! But of course, in
true git fashion, it's a completely different set of fucking commands...


OH SHIT, I NEED TO UNDO MY CHANGES TO A FILE!

# find a hash for a commit before the file was changed
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git checkout [saved hash] -- path/to/file
# the old version of the file will be in your index
git commit -m "Wow, you don't have to copy-paste to undo"

When I finally figured this out it was HUGE. HUGE. H-U-G-E. But seriously
though, on what fucking planet does checkout -- make sense as the best way to
undo a file? :shakes-fist-at-linus-torvalds:


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

Thanks to Eric V. for this one. All complaints about the use of sudo in this
joke can be directed to him.

For real though, if your branch is sooo borked that you need to reset the state
of your repo to be the same as the remote repo in a "git-approved" way, try
this, but beware these are destructive and unrecoverable actions!

# get the lastest state of origin
git fetch origin
git checkout master
git reset --hard origin/master
# delete untracked files and directories
git clean -d --force
# repeat checkout/reset/clean for each borked branch

*Disclaimer: This site is not intended to be an exhaustive reference. And yes,
there are other ways to do these same things with more theoretical purity or
whatever, but I've come to these steps through trial and error and lots of
swearing and table flipping, and I had this crazy idea to share them with a
healthy dose of levity and profanity. Take it or leave it as you will!

Many thanks to everyone who has volunteered to translate the site into new
languages, you rock! Michael Botha (af) · Khaja Md Sher E Alam (bn) · Eduard
Tomek (cs) · Moritz Stückler (de) · Franco Fantini (es) · Hamid Moheb (fa) ·
Senja Jarva (fi) · Michel (fr) · Alex Tzimas (gr) · Elad Leev (he) · Aryan
Sarkar (hi) · Ricky Gultom (id) · fedemcmac (it) · Meiko Hori (ja) · Zhunisali
Shanabek (kk) · Gyeongjae Choi (ko) · Rahul Dahal (ne) · Martijn ten Heuvel (nl)
· Łukasz Wójcik (pl) · Davi Alexandre (pt_BR) · Catalina Focsa (ro) · Daniil
Golubev (ru) · Nemanja Vasić (sr) · Björn Söderqvist (sv) · Kitt Tientanopajai
(th) · Taha Paksu (tr) · Andriy Sultanov (ua) · Tao Jiayuan (zh) . With
additional help from Allie Jones · Artem Vorotnikov · David Fyffe · Frank
Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

If you'd like to help add a translation into your language, submit a PR on
GitHub

What's your Oh shit, git moment? Share it with me! @ohshitgit @ksylor ©
2016-2021 Katie Sylor-Miller