Voltage tolerance is part of a larger family of requirements known as logic levels, which denote the specific voltages acceptable as a logic "high" or "low" by a given logic family of semiconducting devices.
To satisfy the biasing requirements of older RTL and TTL chips, a constant supply voltage had to be used across all chips. 5 volts was chosen because it could handle up to four bipolar transistors (1.2 V drops from emitter to collector) in series between the rails. As chip technology advanced to CMOS devices, the power supply requirements became less strict, and chip manufacturers drove supply voltages lower to reduce Power Consumption. 3.3 V became common as it was easily achievable from one lithium-ion battery, but 1.8 V and then 1.2 V followed driven by the advent of the ultra low-dropout voltage regulator. Modern desktop CPUs run on less than a volt at dozens of amps.
A GPIO pin on a 3.3V or lower microcontroller is 5-volt tolerant if it can handle input voltages of 5 volts without damaging the chip. While most chips have ESD protection which allows a 5-volt transient, current dissipation through the clamp diode will cause issues if the non-tolerant pin is regularly used at 5 V. 5-volt tolerant inputs can also be found on discrete logic devices and other non-controller peripherals designed to operate in a mixed-voltage environment. A logic level translator such as the SparkFun logic level converter or Adafruit bidirectional level translator can be used to interface 5V devices to pins which are not tolerant of those voltages.
Digital input pins are often 5-volt tolerant, but pins with analog input or output capability are seldom 5-volt tolerant. This attribute does not mean that the pin will output 5 volts when high; it will still output between 3.1 and 3.3 volts, which is typically recognized as a "high" voltage by both 3.3V and 5V circuits. While some chips might theoretically be able to "accept" up to 6 V on a 5-volt tolerant pin, such usage is not recommended.
Lower-voltage parts (2.8 V, 1.8 V, or 1.2 V for example) can also be interfaced with 5 V or 3.3 V devices. Check the datasheet carefully for the acceptable input and output high voltages (Voh and Vih especially) to ensure the parts will understand each other.
3.3 V to 5 V
Isn't it nice when things just work that way?
5 V to 3.3 V (5V tolerant)
Only 5-volt tolerant devices allow this.
5 V (open-drain) to 3.3 V
Add pull-up resistor
Open-drain or open-collector pins never pull the output high, so the low-voltage part never sees 5 V. Add a pull-up resistor to pull the line high to low voltage.
5 V to 3.3 V
Use a diode
This essentially makes the 5 V device pin into an open-drain pin. Cheap and easy, but Slew Rate with this setup is poor (only works for slower signals).
Use a MOSFET
Multiple MOSFETs are often packaged together, allowing this setup to be used on multiple pins. Excellent for I2C connections using I2C's inherent pull-up resistor Slew rate still too slow for anything over 1 MHz, like SPI.
Use a buffer IC
Buffer ICs come in sets of 4-8, allowing this setup to be used on many pins. Excellent slew rate and Output Drive, but IC is bigger and more expensive. Required for bidirectional protocols like One-Wire using a level shifter such as the TXB0104 (ref).
BLRS (Purdue SIGBots)