diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb
index 193c91f1742940f4c87c1149ca2dec0d325a1c86..0d6cd86aade96deca923270d4851bd8aecfa8951 100644
--- a/app/models/concerns/mentionable.rb
+++ b/app/models/concerns/mentionable.rb
@@ -62,13 +62,18 @@ module Mentionable
     return [] if text.blank?
 
     refs = all_references(current_user, text, load_lazy_references: load_lazy_references)
-    (refs.issues + refs.merge_requests + refs.commits) - [local_reference]
+    refs = (refs.issues + refs.merge_requests + refs.commits)
+
+    # We're using this method instead of Array diffing because that requires
+    # both of the object's `hash` values to be the same, which may not be the
+    # case for otherwise identical Commit objects.
+    refs.reject! { |ref| ref == local_reference }
   end
 
   # Create a cross-reference Note for each GFM reference to another Mentionable found in +mentionable_text+.
   def create_cross_references!(author = self.author, without = [], text = self.mentionable_text)
     refs = referenced_mentionables(author, text)
-    
+
     # We're using this method instead of Array diffing because that requires
     # both of the object's `hash` values to be the same, which may not be the
     # case for otherwise identical Commit objects.
@@ -111,7 +116,7 @@ module Mentionable
     # Only include changed fields that are mentionable
     source.select { |key, val| mentionable.include?(key) }
   end
-  
+
   # Determine whether or not a cross-reference Note has already been created between this Mentionable and
   # the specified target.
   def cross_reference_exists?(target)
diff --git a/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb b/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb
index c1bcf29b1ba0201aee77cfc76cfdbe6eed7adb5f..a8c9c7efd56b85f5ac4a9bf95b3117e685895889 100644
--- a/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb
+++ b/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb
@@ -148,7 +148,6 @@ module Gitlab::Markdown
       it 'links with adjacent text' do
         doc = filter("Fixed (#{reference}.)")
 
-        exp = Regexp.escape(project2.to_reference)
         expect(doc.to_html).to match(/\(<a.+>#{commit.to_reference(project)}<\/a>\.\)/)
       end
 
diff --git a/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb b/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb
index 49d8a6e44da819f61efc410b7adea66b9a602453..ca3e7151e0296c052d67f348ef21cf707a83a5bd 100644
--- a/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb
+++ b/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb
@@ -121,8 +121,7 @@ module Gitlab::Markdown
       let(:namespace) { create(:namespace, name: 'cross-reference') }
       let(:project2)  { create(:project, :public, namespace: namespace) }
       let(:merge)     { create(:merge_request, source_project: project2, target_project: project2) }
-      let(:reference) { urls.namespace_project_merge_request_url(project2.namespace,
-                                                    project2, merge) + '/diffs#note_123' }
+      let(:reference) { urls.namespace_project_merge_request_url(project2.namespace, project2, merge) + '/diffs#note_123' }
 
       it 'links to a valid reference' do
         doc = filter("See #{reference}")
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index 90be93249511f5b8eef45d4b5d65587758c37553..1aaa927c2163645c5f941a9a6153acf72a463fef 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -15,12 +15,12 @@ describe Commit do
 
   describe '#to_reference' do
     it 'returns a String reference to the object' do
-      expect(commit.to_reference).to eq commit.id
+      expect(commit.to_reference).to eq commit.short_id
     end
 
     it 'supports a cross-project reference' do
       cross = double('project')
-      expect(commit.to_reference(cross)).to eq "#{project.to_reference}@#{commit.id}"
+      expect(commit.to_reference(cross)).to eq "#{project.to_reference}@#{commit.short_id}"
     end
   end
 
@@ -77,14 +77,10 @@ eos
     let(:other_issue) { create :issue, project: other_project }
 
     it 'detects issues that this commit is marked as closing' do
-      allow(commit).to receive(:safe_message).and_return("Fixes ##{issue.iid}")
-      expect(commit.closes_issues).to eq([issue])
-    end
-
-    it 'does not detect issues from other projects' do
       ext_ref = "#{other_project.path_with_namespace}##{other_issue.iid}"
-      allow(commit).to receive(:safe_message).and_return("Fixes #{ext_ref}")
-      expect(commit.closes_issues).to be_empty
+      allow(commit).to receive(:safe_message).and_return("Fixes ##{issue.iid} and #{ext_ref}")
+      expect(commit.closes_issues).to include(issue)
+      expect(commit.closes_issues).to include(other_issue)
     end
   end
 
@@ -92,7 +88,7 @@ eos
     subject { create(:project).commit }
 
     let(:author) { create(:user, email: subject.author_email) }
-    let(:backref_text) { "commit #{subject.id}" }
+    let(:backref_text) { "commit #{subject.short_id}" }
     let(:set_mentionable_text) do
       ->(txt) { allow(subject).to receive(:safe_message).and_return(txt) }
     end
diff --git a/spec/support/mentionable_shared_examples.rb b/spec/support/mentionable_shared_examples.rb
index 3bb568f4d494858c432f259cf37c20ef7465f535..33d2b14583c61b52de1bea228aae2d0ed61daf4f 100644
--- a/spec/support/mentionable_shared_examples.rb
+++ b/spec/support/mentionable_shared_examples.rb
@@ -10,12 +10,12 @@ def common_mentionable_setup
 
   let(:mentioned_issue)  { create(:issue, project: project) }
   let!(:mentioned_mr)     { create(:merge_request, :simple, source_project: project) }
-  let(:mentioned_commit) { project.commit }
+  let(:mentioned_commit) { project.commit("HEAD~1") }
 
   let(:ext_proj)   { create(:project, :public) }
   let(:ext_issue)  { create(:issue, project: ext_proj) }
   let(:ext_mr)     { create(:merge_request, :simple, source_project: ext_proj) }
-  let(:ext_commit) { ext_proj.commit }
+  let(:ext_commit) { ext_proj.commit("HEAD~2") }
 
   # Override to add known commits to the repository stub.
   let(:extra_commits) { [] }
@@ -45,14 +45,11 @@ def common_mentionable_setup
   before do
     # Wire the project's repository to return the mentioned commit, and +nil+
     # for any unrecognized commits.
-    commitmap = {
-      mentioned_commit.id => mentioned_commit
-    }
-    extra_commits.each { |c| commitmap[c.short_id] = c }
-
-    allow(Project).to receive(:find).and_call_original
-    allow(Project).to receive(:find).with(project.id.to_s).and_return(project)
-    allow(project.repository).to receive(:commit) { |sha| commitmap[sha] }
+    allow_any_instance_of(::Repository).to receive(:commit).and_call_original
+    allow_any_instance_of(::Repository).to receive(:commit).with(mentioned_commit.short_id).and_return(mentioned_commit)
+    extra_commits.each do |commit|
+      allow_any_instance_of(::Repository).to receive(:commit).with(commit.short_id).and_return(commit)
+    end
 
     set_mentionable_text.call(ref_string)
   end