8 Jul 2015 • 3 minute read
Some notes on terminology
In case you’re not familiar with some of the terminology used below, here is a small glossary.
An object in Git is either a blob (file), tree (directory), commit, or tag. All objects in Git have a hash (like
99b69df491c0bcf5262a967313fad8be0098352e) and are connected in a way that allows them to be modelled as a directed acyclic graph.
A reference in Git is a bit like a pointer, or a symlink. References are not objects themselves, and they always point to either an object or another reference. Branches, tags, and HEAD are examples of references.
You can learn about all of this and much more in my Hacker’s Guide to Git. (Read more) 26 May 2014 • 46 minute read
A Hacker’s Guide to Git is now available as an e-book. You can purchase it on Leanpub.
Git is currently the most widely used version control system in the world, mostly thanks to GitHub. By that measure, I’d argue that it’s also the most misunderstood version control system in the world.
This statement probably doesn’t ring true straight away because on the surface, Git is pretty simple. It’s really easy to pick up if you’ve come from another VCS like Subversion or Mercurial. It’s even relatively easy to pick up if you’ve never used a VCS before. Everybody understands adding, committing, pushing and pulling; but this is about as far as Git’s simplicity goes. Past this point, Git is shrouded by fear, uncertainty and doubt. (Read more) 17 Aug 2013 • 1 minute read
Most Bower packages will be fetched using a git:// URL, which connects on port 9418. This can be problematic if you’re behind a firewall which blocks this port.
You can get around this quite easily by telling Git to always use https:// instead of git://:
(Read more) 14 Mar 2012 • 1 minute read
git config --global url.https://.insteadOf git://
There are often times when you want to modify a file but not commit the changes, for example changing the database configuration to run on your local machine.
Adding the file to .gitignore doesn’t work, because the file is already tracked. Luckily, Git will allow you to manually “ignore” changes to a file or directory:
git update-index --assume-unchanged <file>
And if you want to start tracking changes again, you can undo the previous command using:
git update-index --no-assume-unchanged <file>
Easy! (Read more) 8 Feb 2012 • 1 minute read
Today I found out just how easy it is to convert an SVN repository to Git without losing any commit history. Note that you will need git-svn (
apt-get install git-svn on Debian/Ubuntu).
git svn clone http://mysvnrepo.com/my-project my-project
git remote add origin email@example.com:/my-project.git
git push origin master
Et voilà, my-project.git has the full commit history of the my-project SVN repository.
If anybody knows whether SVN branches can be converted to Git branches, please get in touch! (Read more) 29 Aug 2011 • 1 minute read
Name and email address
Each commit you make has your name and email address attached to it. Git will automatically configure these based on your username and hostname, but this information is usually not a good identifier. It is a good idea to set your real name and email address so that your commits can be identified easily.
git config --global user.name "Your Name"
git config --global user.email firstname.lastname@example.org
Global ignore file
Often there are files or directories that you want Git to ignore globally. These are probably created automatically by your IDE or operating system. Git’s
core.excludesfile config allows you to write a global .gitignore so that you don’t have to fill local .gitignore files with clutter.
(Read more) 21 Aug 2011 • 1 minute read
git config --global core.excludesfile /path/to/.gitignore_global
Git’s (Read more)
archive command is basically the equivalent of SVN’s
export – it dumps a copy of the entire repository without any of the version control files, making it perfect for deploying to a testing or production server.