diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index d343263289901afeba9e5d620d7db5002e9b54e2..3ab19938c0fa7b07e545f21376234ed4e1990053 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -83,9 +83,13 @@ module Ci
       end
     end
 
+    scope :latest, -> { order(id: :desc) }
+
     # ref can't be HEAD or SHA, can only be branch/tag name
+    scope :latest_for, ->(ref) { where(ref: ref).latest }
+
     def self.latest_successful_for(ref)
-      where(ref: ref).order(id: :desc).success.first
+      latest_for(ref).success.first
     end
 
     def self.truncate_sha(sha)
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 9e7fde9503d0fc0ade1b1bb52e6508f6114f3eb6..2134ba2d75fc3cff17878467412de31cf28062e4 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -232,13 +232,15 @@ class Commit
   def status(ref = nil)
     @statuses ||= {}
 
-    if @statuses.key?(ref)
-      @statuses[ref]
-    elsif ref
-      @statuses[ref] = pipelines.where(ref: ref).status
-    else
-      @statuses[ref] = pipelines.status
-    end
+    return @statuses[ref] if @statuses.key?(ref)
+
+    latest_pipeline = if ref
+                        pipelines.latest_for(ref)
+                      else
+                        pipelines.latest
+                      end.first
+
+    @statuses[ref] = latest_pipeline.try(:status)
   end
 
   def revert_branch_name
diff --git a/changelogs/unreleased/show-commit-status-from-latest-pipeline.yml b/changelogs/unreleased/show-commit-status-from-latest-pipeline.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bbd7a21749356bd4597da3abf0e2b7be33fbc2d2
--- /dev/null
+++ b/changelogs/unreleased/show-commit-status-from-latest-pipeline.yml
@@ -0,0 +1,4 @@
+---
+title: Show commit status from latest pipeline
+merge_request: 7333
+author:
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
index e3bb3482d67b2f881a0bc310166344a0c895ab67..ca27760197094d2506ced1300f17d13661c261dc 100644
--- a/spec/models/commit_spec.rb
+++ b/spec/models/commit_spec.rb
@@ -206,23 +206,18 @@ eos
   end
 
   describe '#status' do
-    context 'without arguments for compound status' do
-      shared_examples 'giving the status from pipeline' do
-        it do
-          expect(commit.status).to eq(Ci::Pipeline.status)
-        end
-      end
-
-      context 'with pipelines' do
-        let!(:pipeline) do
-          create(:ci_empty_pipeline, project: project, sha: commit.sha)
+    context 'without arguments' do
+      before do
+        5.times do
+          create(:ci_empty_pipeline,
+                 project: project,
+                 sha: commit.sha,
+                 status: Ci::Pipeline.all_state_names.sample)
         end
-
-        it_behaves_like 'giving the status from pipeline'
       end
 
-      context 'without pipelines' do
-        it_behaves_like 'giving the status from pipeline'
+      it 'gives the status from latest pipeline' do
+        expect(commit.status).to eq(Ci::Pipeline.latest.first.status)
       end
     end
 
@@ -248,8 +243,8 @@ eos
         expect(commit.status('fix')).to eq(pipeline_from_fix.status)
       end
 
-      it 'gives compound status if ref is nil' do
-        expect(commit.status(nil)).to eq(commit.status)
+      it 'gives status from latest pipeline for whatever branch' do
+        expect(commit.status(nil)).to eq(Ci::Pipeline.latest.first.status)
       end
     end
   end