Question: Does anyone know what the difference between the 3 main types of publishing in Sitecore are?

I have the option to do a republish, incremental publish and a smart publish

My understanding is that a republish will publish everything but I don't understand the incremental or smart options

Answer: 
Here's an overview of each of the publishing methods:

Republish
=========

This publish will simply fully publish out each item again, regardless of whether it has been published before or not. Therefore this is the slowest publish as Sitecore will still transfer over changes that may already be on the target database.

Smart
=====

With this method, Sitecore will look at each item and compare it to the item in the target database (if it exists). If it determines that it needs to be updated, then it publishes the item, otherwise it skips it. I'm not actually sure what method it uses to determine if it needs to be updated, but my guess would be that it uses the `Revision` field which is a GUID that is updated each time an item is updated. If the GUIDs match, it would know that it doesn't need to update the item. Of course, if the item isn't there at all, it will be published.

Incremental
===========

Every time an update is made to an item, Sitecore tracks this change inside the `PublishQueue` table in the database. This is effectively Sitecore recording the fact that this item has changed, and therefore will need to be published. When you do an Incremental publish, this table is simply read to get the list of items that need to be published out. After the publish, this table is cleared.

Incremental is the fastest method of publishing as Sitecore is only publishing out what has changed. However it is also prone to error, for example if the `PublishQueue` table has been cleared before those items have been published, then an incremental publish won't publish those items.
The different publish types define how Sitecore will evaluate which items to move from the master database into the destination publishing target (typically web).

Republish will publish every single item from the source db into the destination db without any checks on whether the item in the source db matches items in the destination db.

Smart publish will scan each item in the source db and compare the items in the destination db, if the version in master is newer then it will publish the items.

Incremental publishes are based on entries stored in the publish queue and history db table. Whenever items are updated via e.g. editors in the content editor it will add an entry into the history table. An incremental publish then uses this data to decide which items to include in its publish operation.