diff --git a/news/1173.bugfix.md b/news/1173.bugfix.md
new file mode 100644
index 00000000..d6271486
--- /dev/null
+++ b/news/1173.bugfix.md
@@ -0,0 +1,1 @@
+Fix a bug that requirement extras and underlying are resolved to the different version
diff --git a/pdm/models/repositories.py b/pdm/models/repositories.py
index 1565d40c..76cf7a45 100644
--- a/pdm/models/repositories.py
+++ b/pdm/models/repositories.py
@@ -78,7 +78,11 @@ class BaseRepository:
             # XXX: If the requirement has extras, add the original candidate
             # (without extras) as its dependency. This ensures the same package with
             # different extras resolve to the same version.
-            self_req = dataclasses.replace(candidate.req, extras=None, marker=None)
+            self_req = dataclasses.replace(
+                candidate.req.as_pinned_version(candidate.version),
+                extras=None,
+                marker=None,
+            )
             reqs.append(self_req)
         # Store the metadata on the candidate for caching
         candidate.requires_python = requires_python

diff --git a/tests/resolver/test_resolve.py b/tests/resolver/test_resolve.py
index 26106963..ac2b3acb 100644
--- a/tests/resolver/test_resolve.py
+++ b/tests/resolver/test_resolve.py
@@ -311,3 +311,14 @@ def test_resolve_extra_requirements_no_break_constraints(resolve, repository):
     result = resolve(["foo[chardet]<0.2.0"])
     assert "chardet" in result
     assert result["foo"].version == "0.1.0"
+
+
+def test_resolve_extra_and_underlying_to_the_same_version(resolve, repository):
+    repository.add_candidate("foo", "0.1.0")
+    repository.add_dependencies("foo", "0.1.0", ["chardet; extra=='enc'"])
+    repository.add_candidate("foo", "0.2.0")
+    repository.add_dependencies("foo", "0.2.0", ["chardet; extra=='enc'"])
+    repository.add_candidate("bar", "0.1.0")
+    repository.add_dependencies("bar", "0.1.0", ["foo[enc]>=0.1.0"])
+    result = resolve(["foo==0.1.0", "bar"])
+    assert result["foo"].version == result["foo[enc]"].version == "0.1.0"

PDM 1.15.4+ unable to update lockfile when package with extras is pinned but extras are not pinned
## Summary

When using 1.15.4 we have seen some projects with large lists of dependencies unable to lock, and PDM eventually quits when it hits the max number of rounds. I think it's due to PDM's algorithm for handling extra dependencies. See the following comment for details.

#### Background
~PDM is unable to find dependency resolution and update the lockfile when run from a docker container in CI, eventually the job times out after 1 hour. When run on a workstation the problem doesn't occur, and the lockfile is able to be successfully updated.~
 
_edit: I thought the issue was the CI environment but it was because our developers were using v1.15.3 on their workstations._

A) One project A, I was unable to figure out why the lock was unsuccessful but when I updated to PDM v2.0.0a it was able to successfully lock both locally and in CI.... 🤔 

B) On project B, a google-cloud-functions project I was able to investigate more, but I'm still confused and think the behavior is a bug.

report about project B continued in below
tests/resolver/test_resolve.py::test_resolve_extra_and_underlying_to_the_same_version
tests/resolver/test_resolve.py::test_resolve_named_requirement tests/resolver/test_resolve.py::test_resolve_requires_python tests/resolver/test_resolve.py::test_resolve_allow_prereleases tests/resolver/test_resolve.py::test_resolve_with_extras tests/resolver/test_resolve.py::test_resolve_local_artifacts[sdist] tests/resolver/test_resolve.py::test_resolve_local_artifacts[wheel] tests/resolver/test_resolve.py::test_resolve_vcs_and_local_requirements[False-/root/data/temp_dir/tmpwuzqdgqr/pdm-project__pdm__0.0/tests/fixtures/projects/demo] tests/resolver/test_resolve.py::test_resolve_vcs_and_local_requirements[False-git+https://github.com/test-root/demo.git#egg=demo] tests/resolver/test_resolve.py::test_resolve_vcs_and_local_requirements[True-/root/data/temp_dir/tmpwuzqdgqr/pdm-project__pdm__0.0/tests/fixtures/projects/demo] tests/resolver/test_resolve.py::test_resolve_vcs_and_local_requirements[True-git+https://github.com/test-root/demo.git#egg=demo] tests/resolver/test_resolve.py::test_resolve_vcs_without_explicit_name tests/resolver/test_resolve.py::test_resolve_local_and_named_requirement tests/resolver/test_resolve.py::test_resolving_auto_avoid_conflicts tests/resolver/test_resolve.py::test_resolve_conflicting_dependencies tests/resolver/test_resolve.py::test_resolve_conflicting_dependencies_with_overrides[2.1] tests/resolver/test_resolve.py::test_resolve_conflicting_dependencies_with_overrides[>=1.8] tests/resolver/test_resolve.py::test_resolve_conflicting_dependencies_with_overrides[==2.1] tests/resolver/test_resolve.py::test_resolve_no_available_versions tests/resolver/test_resolve.py::test_exclude_incompatible_requirements tests/resolver/test_resolve.py::test_union_markers_from_different_parents tests/resolver/test_resolve.py::test_requirements_from_different_groups tests/resolver/test_resolve.py::test_resolve_two_extras_from_the_same_package tests/resolver/test_resolve.py::test_resolve_package_with_dummy_upbound tests/resolver/test_resolve.py::test_resolve_dependency_with_extra_marker tests/resolver/test_resolve.py::test_resolve_circular_dependencies tests/resolver/test_resolve.py::test_resolve_candidates_to_install tests/resolver/test_resolve.py::test_resolve_prefer_requirement_with_prereleases tests/resolver/test_resolve.py::test_resolve_with_python_marker tests/resolver/test_resolve.py::test_resolve_file_req_with_prerelease tests/resolver/test_resolve.py::test_resolve_extra_requirements_no_break_constraints