diff --git a/docs/html/development/architecture/upgrade-options.rst b/docs/html/development/architecture/upgrade-options.rst
index 36e34c71ee9..0527101f8c6 100644
--- a/docs/html/development/architecture/upgrade-options.rst
+++ b/docs/html/development/architecture/upgrade-options.rst
@@ -2,9 +2,10 @@
Options that control the installation process
=============================================
-When installing packages, pip chooses a distribution file, and installs it in
-the user's environment. There are many choices involved in deciding which file
-to install, and these are controlled by a variety of options.
+When installing packages, pip chooses a distribution file, and
+installs it in the user's environment. There are many choices (which
+are `still evolving`_) involved in deciding which file to install, and
+these are controlled by a variety of options.
.. note::
@@ -122,3 +123,6 @@ necessarily resolution or what gets installed.
``--constraint``
``--editable ``
+
+
+.. _still evolving: https://github.com/pypa/pip/issues/8115
diff --git a/docs/html/reference/pip_install.rst b/docs/html/reference/pip_install.rst
index 7d6b5471a2b..be974dacf61 100644
--- a/docs/html/reference/pip_install.rst
+++ b/docs/html/reference/pip_install.rst
@@ -36,6 +36,9 @@ pip install has several stages:
3. Build wheels. All the dependencies that can be are built into wheels.
4. Install the packages (and uninstall anything being upgraded/replaced).
+Note that ``pip install`` prefers to leave the installed version as-is
+unless ``--upgrade`` is specified.
+
Argument Handling
-----------------
diff --git a/docs/html/user_guide.rst b/docs/html/user_guide.rst
index 2e8bfeb026c..677a8a063e7 100644
--- a/docs/html/user_guide.rst
+++ b/docs/html/user_guide.rst
@@ -197,18 +197,16 @@ In practice, there are 4 common uses of Requirements files:
py -m pip freeze > requirements.txt
py -m pip install -r requirements.txt
-2. Requirements files are used to force pip to properly resolve
- dependencies. In versions of pip prior to 20.3, pip `doesn't have
- true dependency resolution
- `_, but instead simply uses
- the first specification it finds for a project. E.g. if ``pkg1``
- requires ``pkg3>=1.0`` and ``pkg2`` requires ``pkg3>=1.0,<=2.0``,
- and if ``pkg1`` is resolved first, pip will only use ``pkg3>=1.0``,
- and could easily end up installing a version of ``pkg3`` that
- conflicts with the needs of ``pkg2``. To solve this problem for
- pip 20.2 and previous, you can place ``pkg3>=1.0,<=2.0`` (i.e. the
- correct specification) into your requirements file directly along
- with the other top level requirements. Like so::
+2. Requirements files are used to force pip to properly resolve dependencies.
+ pip 20.2 and earlier `doesn't have true dependency resolution
+ `_, but instead simply uses the first
+ specification it finds for a project. E.g. if ``pkg1`` requires
+ ``pkg3>=1.0`` and ``pkg2`` requires ``pkg3>=1.0,<=2.0``, and if ``pkg1`` is
+ resolved first, pip will only use ``pkg3>=1.0``, and could easily end up
+ installing a version of ``pkg3`` that conflicts with the needs of ``pkg2``.
+ To solve this problem, you can place ``pkg3>=1.0,<=2.0`` (i.e. the correct
+ specification) into your requirements file directly along with the other top
+ level requirements. Like so::
pkg1
pkg2
@@ -291,7 +289,11 @@ organisation and use that everywhere. If the thing being installed requires
"helloworld" to be installed, your fixed version specified in your constraints
file will be used.
-Constraints file support was added in pip 7.1.
+Constraints file support was added in pip 7.1. In :ref:`Resolver
+changes 2020` we did a fairly comprehensive overhaul, removing several
+undocumented and unsupported quirks from the previous implementation,
+and stripped constraints files down to being purely a way to specify
+global (version) limits for packages.
.. _`Installing from Wheels`:
@@ -1437,17 +1439,37 @@ time to fix the underlying problem in the packages, because pip will
be stricter from here on out.
This also means that, when you run a ``pip install`` command, pip only
-considers the packages you are installing in that command, and may
-break already-installed packages. It will not guarantee that your
+considers the packages you are installing in that command, and **may
+break already-installed packages**. It will not guarantee that your
environment will be consistent all the time. If you ``pip install x``
and then ``pip install y``, it's possible that the version of ``y``
you get will be different than it would be if you had run ``pip
-install x y`` in a single command. We would like your thoughts on what
+install x y`` in a single command. We are considering changing this
+behavior (per :issue:`7744`) and would like your thoughts on what
pip's behavior should be; please answer `our survey on upgrades that
create conflicts`_.
-We are also changing our support for :ref:`Constraints Files`:
-
+We are also changing our support for :ref:`Constraints Files`,
+editable installs, and related functionality. We did a fairly
+comprehensive overhaul and stripped constraints files down to being
+purely a way to specify global (version) limits for packages, and so
+some combinations that used to be allowed will now cause
+errors. Specifically:
+
+* Constraints don't override the existing requirements; they simply
+ constrain what versions are visible as input to the resolver (see
+ :issue:`9020`)
+* Providing an editable requirement (``-e .``) does not cause pip to
+ ignore version specifiers or constraints (see :issue:`8076`), and if
+ you have a conflict between a pinned requirement and a local
+ directory then pip will indicate that it cannot find a version
+ satisfying both (see :issue:`8307`)
+* Hash-checking mode requires that all requirements are specified as a
+ ``==`` match on a version and may not work well in combination with
+ constraints (see :issue:`9020` and :issue:`8792`)
+* If necessary to satisfy constraints, pip will happily reinstall
+ packages, upgrading or downgrading, without needing any additional
+ command-line options (see :issue:`8115` and :doc:`development/architecture/upgrade-options`)
* Unnamed requirements are not allowed as constraints (see :issue:`6628` and :issue:`8210`)
* Links are not allowed as constraints (see :issue:`8253`)
* Constraints cannot have extras (see :issue:`6628`)
diff --git a/news/9056.doc.rst b/news/9056.doc.rst
new file mode 100644
index 00000000000..7317dc9cd0d
--- /dev/null
+++ b/news/9056.doc.rst
@@ -0,0 +1 @@
+Improve migration guide to reflect changes in new resolver behavior.