diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,29 @@
-## [*Unreleased*](https://github.com/pbrisbin/load-env/compare/v0.2.0.2...master)
+## [*Unreleased*](https://github.com/pbrisbin/load-env/compare/v0.2.1.0...master)
 
 None
+
+## [v0.2.1.0](https://github.com/pbrisbin/load-env/compare/v0.2.0.2...v0.2.1.0)
+
+- Don't override values already set in the environment
+
+  Given a hypothetical program `load-env`, which uses one of our `loadEnv`
+  functions on `stdin`:
+
+  Previously,
+
+  ```
+  FOO=bar load-env <<EOM
+  FOO=bat
+  EOM
+  ```
+
+  would override `FOO` to `bat` when `load-env` ran. But now, it will see `FOO`
+  is already `bar` and leave it.
+
+  This is better behavior under the assumption that a `.env` file is meant to
+  specify *defaults* in the case of nothing explicit. When there are explicit
+  values in the environment, it's most likely that our user indeed wants them
+  respected.
 
 ## [v0.2.0.2](https://github.com/pbrisbin/load-env/compare/v0.2.0.1...v0.2.0.2)
 
diff --git a/load-env.cabal b/load-env.cabal
--- a/load-env.cabal
+++ b/load-env.cabal
@@ -1,11 +1,13 @@
--- This file has been generated from package.yaml by hpack version 0.28.2.
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.31.1.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: c39eb0ad2f6482017271ab93ef8f962a61068806291ebaa457c3fa6f3dd34055
+-- hash: cb9cf61d4827d4897e0bb920005dafac784c77c15cae85f88bb288ea97ef2613
 
 name:           load-env
-version:        0.2.0.2
+version:        0.2.1.0
 synopsis:       Load environment variables from a file.
 description:    Parse a .env file and load any declared variables into the current process's environment. This allows for a .env file to specify development-friendly defaults for configuration values normally set in the deployment environment.
 category:       Configuration
@@ -16,16 +18,20 @@
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.10
 extra-source-files:
-    CHANGELOG.md
     README.md
+    CHANGELOG.md
 
 source-repository head
   type: git
   location: https://github.com/pbrisbin/load-env
 
 library
+  exposed-modules:
+      LoadEnv
+      LoadEnv.Parse
+  other-modules:
+      Paths_load_env
   hs-source-dirs:
       src
   ghc-options: -Wall
@@ -34,11 +40,6 @@
     , directory
     , filepath
     , parsec
-  exposed-modules:
-      LoadEnv
-      LoadEnv.Parse
-  other-modules:
-      Paths_load_env
   default-language: Haskell2010
 
 test-suite doctest
@@ -57,6 +58,10 @@
 test-suite spec
   type: exitcode-stdio-1.0
   main-is: Spec.hs
+  other-modules:
+      LoadEnv.ParseSpec
+      LoadEnvSpec
+      Paths_load_env
   hs-source-dirs:
       test
   ghc-options: -Wall
@@ -67,8 +72,4 @@
     , load-env
     , parsec
     , temporary
-  other-modules:
-      LoadEnv.ParseSpec
-      LoadEnvSpec
-      Paths_load_env
   default-language: Haskell2010
diff --git a/src/LoadEnv.hs b/src/LoadEnv.hs
--- a/src/LoadEnv.hs
+++ b/src/LoadEnv.hs
@@ -23,14 +23,15 @@
     , loadEnvFromAbsolute
     ) where
 
-import Control.Monad ((<=<))
+import Control.Monad (unless, (<=<))
 import Data.Bool (bool)
 import Data.Foldable (for_, traverse_)
 import Data.List (inits)
+import Data.Maybe (isJust)
 import LoadEnv.Parse
 import System.Directory
     (doesFileExist, findFile, getCurrentDirectory, makeAbsolute)
-import System.Environment (setEnv)
+import System.Environment (lookupEnv, setEnv)
 import System.FilePath (isRelative, joinPath, splitDirectories)
 import Text.Parsec.String (parseFromFile)
 
@@ -63,7 +64,12 @@
 
     for_ mFile $ \file -> do
         result <- parseFromFile parseEnvironment file
-        either print (traverse_ $ uncurry setEnv) result
+        either print (traverse_ $ uncurry defaultEnv) result
+
+defaultEnv :: String -> String -> IO ()
+defaultEnv k v = do
+    exists <- isJust <$> lookupEnv k
+    unless exists $ setEnv k v
 
 -- | @'loadEnvFrom'@, but don't traverse up the directory tree
 loadEnvFromAbsolute :: FilePath -> IO ()
diff --git a/test/LoadEnvSpec.hs b/test/LoadEnvSpec.hs
--- a/test/LoadEnvSpec.hs
+++ b/test/LoadEnvSpec.hs
@@ -25,6 +25,15 @@
             mbar `shouldBe` Just "bar"
             mbat `shouldBe` Just "bat"
 
+        it "does not override pre-existing variables" $ do
+            writeFile envFile $ unlines ["FOO=bar"]
+            setEnv "FOO" "baz"
+
+            loadEnvFrom envFile
+
+            mbar <- lookupEnv "FOO"
+            mbar `shouldBe` Just "baz"
+
         it "does not fail if the file is not present" $ do
             loadEnvFrom "i-do-not-exist"
 
