diff --git a/pydantic/env_settings.py b/pydantic/env_settings.py
--- a/pydantic/env_settings.py
+++ b/pydantic/env_settings.py
@@ -66,7 +66,7 @@ class Config:
         @classmethod
         def prepare_field(cls, field: ModelField) -> None:
             env_names: Iterable[str]
-            env = field.field_info.extra.pop('env', None)
+            env = field.field_info.extra.get('env')
             if env is None:
                 if field.has_alias:
                     warnings.warn(
diff --git a/pydantic/fields.py b/pydantic/fields.py
--- a/pydantic/fields.py
+++ b/pydantic/fields.py
@@ -280,6 +280,7 @@ def infer(
     def set_config(self, config: Type['BaseConfig']) -> None:
         self.model_config = config
         info_from_config = config.get_field_info(self.name)
+        config.prepare_field(self)
         if info_from_config:
             self.field_info.alias = info_from_config.get('alias') or self.field_info.alias or self.name
             self.alias = cast(str, self.field_info.alias)

I'm looking into this, but I'm afraid the solution isn't trivial.

Weird that this got 11 :+1: and 2 :eyes: in 2 hours. Any idea why this happened?
diff --git a/tests/test_settings.py b/tests/test_settings.py
--- a/tests/test_settings.py
+++ b/tests/test_settings.py
@@ -376,3 +376,18 @@ class SubSettings(Settings):
     assert SubSettings().dict() == {'foo': 'fff', 'bar': 'bbb', 'spam': 'spam default'}
     env.set('spam', 'sss')
     assert SubSettings().dict() == {'foo': 'fff', 'bar': 'bbb', 'spam': 'sss'}
+
+
+def test_prefix_on_parent(env):
+    class MyBaseSettings(BaseSettings):
+        var: str = 'old'
+
+    class MySubSettings(MyBaseSettings):
+        class Config:
+            env_prefix = 'PREFIX_'
+
+    assert MyBaseSettings().dict() == {'var': 'old'}
+    assert MySubSettings().dict() == {'var': 'old'}
+    env.set('PREFIX_VAR', 'new')
+    assert MyBaseSettings().dict() == {'var': 'old'}
+    assert MySubSettings().dict() == {'var': 'new'}

Settings inheritance with ENV prefix does not work
# Bug

* OS: ubuntu 18.04
* Python version `import sys; print(sys.version)`: 3.7.5 (default, Nov  7 2019, 10:50:52) 
* Pydantic version `import pydantic; print(pydantic.VERSION)`: `1.0b1` or `1.2`, but works fine with `0.32`

```py
import os
from pydantic import BaseSettings


class MyBaseSettings(BaseSettings):
    var: int = 10


class MySubSettings(MyBaseSettings):
    class Config:
        env_prefix = 'PREFIX_'


os.environ['PREFIX_VAR'] = '2'
k = MySubSettings()
print(k.var)  # 10, but should be 2
```

We expect that `k.var` will be equal to 2, but it has default value 10.
It's reproduced since 1.0b1.

tests/test_settings.py::test_prefix_on_parent
tests/test_settings.py::test_sub_env tests/test_settings.py::test_sub_env_override tests/test_settings.py::test_sub_env_missing tests/test_settings.py::test_other_setting tests/test_settings.py::test_with_prefix tests/test_settings.py::test_nested_env_with_basemodel tests/test_settings.py::test_nested_env_with_dict tests/test_settings.py::test_list tests/test_settings.py::test_set_dict_model tests/test_settings.py::test_invalid_json tests/test_settings.py::test_required_sub_model tests/test_settings.py::test_non_class tests/test_settings.py::test_env_str tests/test_settings.py::test_env_list tests/test_settings.py::test_env_list_field tests/test_settings.py::test_env_list_last tests/test_settings.py::test_env_inheritance tests/test_settings.py::test_env_inheritance_field tests/test_settings.py::test_env_invalid tests/test_settings.py::test_env_field tests/test_settings.py::test_aliases_warning tests/test_settings.py::test_aliases_no_warning tests/test_settings.py::test_case_sensitive tests/test_settings.py::test_case_insensitive tests/test_settings.py::test_nested_dataclass tests/test_settings.py::test_env_takes_precedence tests/test_settings.py::test_config_file_settings_nornir tests/test_settings.py::test_alias_set