diff --git a/rbtools/clients/base/scmclient.py b/rbtools/clients/base/scmclient.py
index 931ba88e06b0ea2c8b600f949ba18798fe6402ad..8c018eaef2f66f015f70ce7902dbe1c1e03a0436 100644
--- a/rbtools/clients/base/scmclient.py
+++ b/rbtools/clients/base/scmclient.py
@@ -7,7 +7,6 @@ Version Added:
 import argparse
 import logging
 import re
-from functools import lru_cache
 from typing import Any, Dict, List, Mapping, Optional, Tuple, Union, cast
 
 from typing_extensions import NotRequired, TypedDict, final
@@ -473,6 +472,7 @@ class BaseSCMClient(object):
         self.capabilities = None
         self.is_setup = False
 
+        self._diff_tool: Optional[BaseDiffTool] = None
         self._has_deps: Optional[bool] = None
 
     @property
@@ -666,7 +666,6 @@ class BaseSCMClient(object):
         """
         return None
 
-    @lru_cache(maxsize=None)
     def get_diff_tool(self) -> Optional[BaseDiffTool]:
         """Return a diff tool for use with this client.
 
@@ -692,17 +691,24 @@ class BaseSCMClient(object):
             rbtools.diffs.tools.errors.MissingDiffToolError:
                 No compatible diff tool could be found.
         """
-        if self.requires_diff_tool is True:
-            return diff_tools_registry.get_available()
-        elif self.requires_diff_tool is False:
-            return None
-        elif isinstance(self.requires_diff_tool, list):
-            return diff_tools_registry.get_available(
-                compatible_diff_tool_ids=self.requires_diff_tool)
-        else:
-            raise TypeError(
-                'Unexpected type %s for %s.requires_diff_tool.'
-                % (type(self.requires_diff_tool), type(self).__name__))
+        diff_tool = self._diff_tool
+
+        if diff_tool is None:
+            if self.requires_diff_tool is True:
+                diff_tool = diff_tools_registry.get_available()
+            elif self.requires_diff_tool is False:
+                diff_tool = None
+            elif isinstance(self.requires_diff_tool, list):
+                diff_tool = diff_tools_registry.get_available(
+                    compatible_diff_tool_ids=self.requires_diff_tool)
+            else:
+                raise TypeError(
+                    'Unexpected type %s for %s.requires_diff_tool.'
+                    % (type(self.requires_diff_tool), type(self).__name__))
+
+            self._diff_tool = diff_tool
+
+        return diff_tool
 
     def find_matching_server_repository(
         self,
diff --git a/rbtools/clients/tests/test_base_scmclient.py b/rbtools/clients/tests/test_base_scmclient.py
index 3ab46ee547906237f0d3c13e30092bf437d88ecf..969e219d9f6c93fe83b158cc1dfc03133b71d0e5 100644
--- a/rbtools/clients/tests/test_base_scmclient.py
+++ b/rbtools/clients/tests/test_base_scmclient.py
@@ -8,8 +8,9 @@ import kgb
 from rbtools.clients import BaseSCMClient
 from rbtools.clients.errors import SCMClientDependencyError
 from rbtools.deprecation import RemovedInRBTools50Warning
-from rbtools.diffs.tools.errors import MissingDiffToolError
 from rbtools.diffs.tools.backends.gnu import GNUDiffTool
+from rbtools.diffs.tools.errors import MissingDiffToolError
+from rbtools.diffs.tools.registry import diff_tools_registry
 from rbtools.testing import TestCase
 
 
@@ -198,8 +199,11 @@ class BaseSCMClientTests(kgb.SpyAgency, TestCase):
                     owner=GNUDiffTool,
                     op=kgb.SpyOpReturn(True))
 
-        client = MySCMClient()
-        self.assertIsInstance(client.get_diff_tool(), GNUDiffTool)
+        try:
+            client = MySCMClient()
+            self.assertIsInstance(client.get_diff_tool(), GNUDiffTool)
+        finally:
+            diff_tools_registry.reset()
 
     def test_get_diff_tool_with_requires_false(self):
         """Testing BaseSCMClient.get_diff_tool with requires_diff_tool=False
diff --git a/rbtools/diffs/tools/registry.py b/rbtools/diffs/tools/registry.py
index fe5c5fb71ccda36d0b0fb28828ebb9a4e17938e4..ad7e5a522432af4dc7211de1e8aa8ed2f4f81a39 100644
--- a/rbtools/diffs/tools/registry.py
+++ b/rbtools/diffs/tools/registry.py
@@ -161,6 +161,17 @@ class DiffToolsRegistry:
 
         self._register(diff_tool_cls)
 
+    def reset(self) -> None:
+        """Reset the registry to an empty state.
+
+        This is primarily intended for unit testing, to ensure that any
+        new attempts to fetch tools will result in fresh instances.
+        """
+        self._classes_populated = False
+        self._instances_populated = False
+        self._diff_tool_classes = {}
+        self._diff_tools = []
+
     def _populate_classes(self) -> None:
         """Populate all the default diff tool classes.
 
