How do you even lose data when using git?
I originally wrote this article for Volume 124, Issue 5 of mathNEWS.
It’s 18:00 on a Saturday night, and you see your friend Joseph force push to your git repo for compilers. Six minutes later, a commit is added to that repo: “Joseph is an idiot.” What on earth happened, and how can you prevent this catastrophe from afflicting your group?
Root cause analysis determined the cause of this particular disaster to be
“Untracked files”. How? git status
lists files that haven’t been
committed to the repository under the heading “Untracked files”. However, if
having “Untracked files” is the normal state for your repository, then you’ll
have to manually sift through the output of git status
to realize
you forget to commit a file you actually want to keep around for later. The
chances of you doing that for each commit you make the night before the
deadline? Nil. So you’ll lose the files once you git checkout
another branch… and once you realize, it’s too late, and you’ll have to
recreate the files from memory. The loss of precious minutes when you least
have them to spare!
How can you protect you code and your loved ones from this disaster? It’s easy!
You simply need to make judicious use of .gitignore
. Create a file
named .gitignore
in your repository and commit it; each line that
doesn’t start with a #
contains a pattern matching files that git
shouldn’t track or add to the repository. Chances are, you won’t even have to
write the file yourself – you can probably concatenate together the files for
your two or three favourite programming languages and editors (say,
Go.gitignore, Erlang.gitignore, and Global/Kate.gitignore) from the collection
at https://github.com/github/gitignore.
“But I use LaTeX,” you might protest, “and I also need to commit
.log
files generated by my code!” I do agree, that
TeX.gitignore
contains some rather sweeping patterns, such as *.log
and
*.out
. There’s a simple pattern to handle this too: I create a
directory named latex
or report
in the top of my
repository, place my .tex
files in it, as well as a copy of
TeX.gitignore
named .gitignore
. Since the rules in
latex/.gitignore
only affect files stored under
latex/
, you’re free to add .log
and .out
files anywhere else in the tree.
In fact, I’ve got a bit of a pattern going now with how I start my assignments:
- se465 (folder so I can tell each "a1" repo apart)
- a1 (this is a git repo)
- .gitignore
- latex
- .gitignore
- Makefile
- a1_sub.tex
- q1
- q1.java
- ...
- a1 (this is a git repo)
Now if only I had figured this out in first year. But now that I have, you don’t have to!
Just take a little bit of time when you start your next CS assignment, and make sure git tells you about only the Untracked files you care about!
!able