diff --git a/Gemfile b/Gemfile
index 64e5ea8bcce53cacc8212767a773b286f392e6c0..5e7b37381858af9dda9f86712b849bb8b9762c6e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -479,7 +479,7 @@ gem 'ssh_data', '~> 1.2'
 gem 'spamcheck', '~> 0.1.0'
 
 # Gitaly GRPC protocol definitions
-gem 'gitaly', '~> 14.9.0.pre.rc2'
+gem 'gitaly', '~> 14.9.0.pre.rc3'
 
 # KAS GRPC protocol definitions
 gem 'kas-grpc', '~> 0.0.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index 6fe4cdc97260378b234bc423773195b77e7e1afd..d2e2d1e6438f475816340cab2ce82431ac04a33e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -455,7 +455,7 @@ GEM
       rails (>= 3.2.0)
     git (1.7.0)
       rchardet (~> 1.8)
-    gitaly (14.9.0.pre.rc2)
+    gitaly (14.9.0.pre.rc3)
       grpc (~> 1.0)
     github-markup (1.7.0)
     gitlab (4.16.1)
@@ -1486,7 +1486,7 @@ DEPENDENCIES
   gettext (~> 3.3)
   gettext_i18n_rails (~> 1.8.0)
   gettext_i18n_rails_js (~> 1.3)
-  gitaly (~> 14.9.0.pre.rc2)
+  gitaly (~> 14.9.0.pre.rc3)
   github-markup (~> 1.7.0)
   gitlab-chronic (~> 0.10.5)
   gitlab-dangerfiles (~> 2.10.2)
diff --git a/app/models/repository.rb b/app/models/repository.rb
index e0b1901d188f3cd1092c17c3fc8042504e6ef51d..346478b6689bacfdfce27f5c3970078179382511 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -1085,10 +1085,10 @@ def blob_data_at(sha, path)
     blob.data
   end
 
-  def create_if_not_exists
+  def create_if_not_exists(default_branch = nil)
     return if exists?
 
-    raw.create_repository
+    raw.create_repository(default_branch)
     after_create
 
     true
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index b04fca64c871254696554a5bfa8f8d4c3ef47798..ac87da4f3c8d34a78e1572fad3d900c624daf86b 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -367,7 +367,7 @@ def change_head_to_default_branch
   def create_repository
     return if repository_exists? && snippet_repository
 
-    repository.create_if_not_exists
+    repository.create_if_not_exists(default_branch)
     track_snippet_repository(repository.storage)
   end
 
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index c3ee5b97379e73e0c07ee185b10081a14d78ac6a..1492ea1ce763738997f5cd9e15bc8903fc22ffd4 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -99,9 +99,9 @@ def exists?
         gitaly_repository_client.exists?
       end
 
-      def create_repository
+      def create_repository(default_branch = nil)
         wrapped_gitaly_errors do
-          gitaly_repository_client.create_repository
+          gitaly_repository_client.create_repository(default_branch)
         rescue GRPC::AlreadyExists => e
           raise RepositoryExists, e.message
         end
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 51d0730bb1dba8196f58b9f2695b18fa53e63c43..5c447dfd41729e2e4f2cfe4a5a1b9acd5db45d72 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -107,8 +107,8 @@ def fetch_remote(url, refmap:, ssh_auth:, forced:, no_tags:, timeout:, prune: tr
       end
       # rubocop: enable Metrics/ParameterLists
 
-      def create_repository
-        request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo)
+      def create_repository(default_branch = nil)
+        request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo, default_branch: default_branch)
         GitalyClient.call(@storage, :repository_service, :create_repository, request, timeout: GitalyClient.fast_timeout)
       end
 
diff --git a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
index d22aa86dbe066b86904647f751bf6de6641bfdd5..cfa03db52feff589e61a8bf229ad78aa8911dff5 100644
--- a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
+++ b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb
@@ -78,6 +78,10 @@
     end
 
     shared_examples 'migration_bot user commits files' do
+      before do
+        allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main')
+      end
+
       it do
         subject
 
@@ -89,6 +93,10 @@
     end
 
     shared_examples 'commits the file to the repository' do
+      before do
+        allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main')
+      end
+
       context 'when author can update snippet and use git' do
         it 'creates the repository and commit the file' do
           subject
@@ -269,6 +277,10 @@
       let!(:snippet) { snippets.create!(id: 5, type: 'PersonalSnippet', author_id: other_user.id, file_name: file_name, content: content) }
       let(:ids) { [4, 5] }
 
+      before do
+        allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main')
+      end
+
       after do
         raw_repository(snippet).remove
         raw_repository(invalid_snippet).remove
diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
index 229ab70a65d2547b3e4d50674c10d870d38e203b..39de9a653901d89043d55f815b1952f12930d0b0 100644
--- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb
@@ -218,6 +218,26 @@
     end
   end
 
+  describe '#create_repository' do
+    it 'sends a create_repository message without arguments' do
+      expect_any_instance_of(Gitaly::RepositoryService::Stub)
+        .to receive(:create_repository)
+        .with(gitaly_request_with_path(storage_name, relative_path).and(gitaly_request_with_params(default_branch: '')), kind_of(Hash))
+        .and_return(double)
+
+      client.create_repository
+    end
+
+    it 'sends a create_repository message with default branch' do
+      expect_any_instance_of(Gitaly::RepositoryService::Stub)
+        .to receive(:create_repository)
+        .with(gitaly_request_with_path(storage_name, relative_path).and(gitaly_request_with_params(default_branch: 'default-branch-name')), kind_of(Hash))
+        .and_return(double)
+
+      client.create_repository('default-branch-name')
+    end
+  end
+
   describe '#create_from_snapshot' do
     it 'sends a create_repository_from_snapshot message' do
       expect_any_instance_of(Gitaly::RepositoryService::Stub)
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index e592a4964f532044cf3f5e40ea4be531f59eadc2..215f83adf5d806970eac8818c020dcb112c6157a 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -3062,6 +3062,14 @@ def expect_contributors(*contributors)
       repository.create_if_not_exists
     end
 
+    it 'creates a repository with a default branch name' do
+      default_branch_name = 'branch-a'
+      repository.create_if_not_exists(default_branch_name)
+      repository.create_file(user, 'file', 'content', message: 'initial commit', branch_name: default_branch_name)
+
+      expect(repository.root_ref).to eq(default_branch_name)
+    end
+
     context 'it does nothing if the repository already existed' do
       let(:project) { create(:project, :repository) }
 
diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb
index 92e4bc7d1a94f0455763c7e487a6986b6b8c3f85..e80814cef5c068824db6612ca6a14719925bbb29 100644
--- a/spec/models/snippet_spec.rb
+++ b/spec/models/snippet_spec.rb
@@ -667,6 +667,16 @@ def to_json(params = {})
       expect(snippet.repository.exists?).to be_truthy
     end
 
+    it 'sets the default branch' do
+      expect(snippet).to receive(:default_branch).and_return('default-branch-1')
+      expect(subject).to be_truthy
+
+      snippet.repository.create_file(snippet.author, 'file', 'content', message: 'initial commit', branch_name: 'default-branch-1')
+
+      expect(snippet.repository.exists?).to be_truthy
+      expect(snippet.repository.root_ref).to eq('default-branch-1')
+    end
+
     it 'tracks snippet repository' do
       expect do
         subject
@@ -677,6 +687,7 @@ def to_json(params = {})
       expect(snippet).to receive(:repository_storage).and_return('picked')
       expect(snippet).to receive(:repository_exists?).and_return(false)
       expect(snippet.repository).to receive(:create_if_not_exists)
+      allow(snippet).to receive(:default_branch).and_return('picked')
 
       subject
 
@@ -899,22 +910,6 @@ def to_json(params = {})
       end
     end
 
-    context 'when repository is empty' do
-      let(:snippet) { create(:snippet, :empty_repo) }
-
-      before do
-        allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return(default_branch)
-      end
-
-      context 'when default branch in settings is different from "master"' do
-        let(:default_branch) { 'custom-branch' }
-
-        it 'changes the HEAD reference to the default branch' do
-          expect { subject }.to change { File.read(head_path).squish }.to("ref: refs/heads/#{default_branch}")
-        end
-      end
-    end
-
     context 'when repository is not empty' do
       let(:snippet) { create(:snippet, :empty_repo) }