diff --git a/CHANGELOG b/CHANGELOG
index a294c750ccb12d73f2cf34c834cab5baa7c6c2f7..382318a203cc5829f90bbf265d510f79be2a4bfb 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -43,6 +43,9 @@ v 8.7.0 (unreleased)
   - API: Expose 'updated_at' for issue, snippet, and merge request notes (Robert Schilling)
   - API: User can leave a project through the API when not master or owner. !3613
 
+v 8.6.6
+  - Fix error on language detection when repository has no HEAD (e.g., master branch). !3654 (Jeroen Bobbeldijk)
+
 v 8.6.5
   - Fix importing from GitHub Enterprise. !3529
   - Perform the language detection after updating merge requests in `GitPushService`, leading to faster visual feedback for the end-user. !3533
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 8dead3a58846b483c9aad3efaed5233a20b94820..462b48118ef504e53fa0a8f842b8e23482e5bf18 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -896,9 +896,9 @@ class Repository
   end
 
   def main_language
-    unless empty?
-      Linguist::Repository.new(rugged, rugged.head.target_id).language
-    end
+    return if empty? || rugged.head_unborn?
+
+    Linguist::Repository.new(rugged, rugged.head.target_id).language
   end
 
   def avatar