diff --git a/CHANGELOG b/CHANGELOG
index a1add261a8950ab98ddc3137da6f890929a84594..b74c7a0590849cedfed378165b1888c1301691ca 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 Please view this file on the master branch, on stable branches it's out of date.
 
 v 8.13.0 (unreleased)
+  - Add link from system note to compare with previous version
   - Use gitlab-shell v3.6.2 (GIT TRACE logging)
   - AbstractReferenceFilter caches project_refs on RequestStore when active
   - Speed-up group milestones show page
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index 0c8446e7c3d6457ed76326bc7ef6f9dc43cdc6d0..8da1af67ee673392c43472c914d63c532bf9db2c 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -21,7 +21,8 @@ module SystemNoteService
     total_count  = new_commits.length + existing_commits.length
     commits_text = "#{total_count} commit".pluralize(total_count)
 
-    body = "Added #{commits_text}:\n\n"
+    body = "[Compare with previous version](#{diff_comparison_url(noteable, project, oldrev)})\n\n"
+    body << "Added #{commits_text}:\n\n"
     body << existing_commit_summary(noteable, existing_commits, oldrev)
     body << new_commit_summary(new_commits).join("\n")
 
@@ -466,4 +467,16 @@ module SystemNoteService
   def escape_html(text)
     Rack::Utils.escape_html(text)
   end
+
+  def diff_comparison_url(merge_request, project, oldrev)
+    diff_id = merge_request.merge_request_diff.id
+
+    Gitlab::Routing.url_helpers.diffs_namespace_project_merge_request_url(
+      project.namespace,
+      project,
+      merge_request.iid,
+      diff_id: diff_id,
+      start_sha: oldrev
+    )
+  end
 end
diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb
index 3d854a959f309cad1010695e8b9e8850154b19a9..16e345501d9a10e56ecae9ef4f5eced30f17d6ac 100644
--- a/spec/services/system_note_service_spec.rb
+++ b/spec/services/system_note_service_spec.rb
@@ -40,21 +40,35 @@ describe SystemNoteService, services: true do
     describe 'note body' do
       let(:note_lines) { subject.note.split("\n").reject(&:blank?) }
 
+      describe 'comparison diff link line' do
+        it 'adds the comparison link' do
+          link = Gitlab::Routing.url_helpers.diffs_namespace_project_merge_request_url(
+            project.namespace,
+            project,
+            noteable.iid,
+            diff_id: noteable.merge_request_diff.id,
+            start_sha: oldrev
+          )
+
+          expect(note_lines[0]).to eq "[Compare with previous version](#{link})"
+        end
+      end
+
       context 'without existing commits' do
         it 'adds a message header' do
-          expect(note_lines[0]).to eq "Added #{new_commits.size} commits:"
+          expect(note_lines[1]).to eq "Added #{new_commits.size} commits:"
         end
 
         it 'adds a message line for each commit' do
           new_commits.each_with_index do |commit, i|
             # Skip the header
-            expect(note_lines[i + 1]).to eq "* #{commit.short_id} - #{commit.title}"
+            expect(note_lines[i + 2]).to eq "* #{commit.short_id} - #{commit.title}"
           end
         end
       end
 
       describe 'summary line for existing commits' do
-        let(:summary_line) { note_lines[1] }
+        let(:summary_line) { note_lines[2] }
 
         context 'with one existing commit' do
           let(:old_commits) { [noteable.commits.last] }