diff --git a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
index 853e839a7abbd54730afd6dedb8e806efc328680..73c91839f04895bd8c1d0ff7da7e8d20a7f2e2c7 100644
--- a/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
+++ b/app/assets/javascripts/pipeline_editor/components/editor/ci_config_merged_preview.vue
@@ -1,18 +1,27 @@
 <script>
-import { GlIcon } from '@gitlab/ui';
+import { GlAlert, GlLink, GlSprintf, GlIcon } from '@gitlab/ui';
 import { uniqueId } from 'lodash';
+import { helpPagePath } from '~/helpers/help_page_helper';
 import { s__ } from '~/locale';
 import SourceEditor from '~/vue_shared/components/source_editor.vue';
+import getCurrentBranch from '../../graphql/queries/client/current_branch.graphql';
 
 export default {
   i18n: {
     viewOnlyMessage: s__('Pipelines|Merged YAML is view only'),
+    unavailableDefaultTitle: s__('Pipelines|Merged YAML unavailable'),
+    unavailableDefaultText: s__(
+      'Pipelines|The merged YAML view is only available for the default branch. %{linkStart}Learn more.%{linkEnd}',
+    ),
   },
   components: {
     SourceEditor,
+    GlAlert,
     GlIcon,
+    GlLink,
+    GlSprintf,
   },
-  inject: ['ciConfigPath'],
+  inject: ['ciConfigPath', 'defaultBranch'],
   props: {
     ciConfigData: {
       type: Object,
@@ -24,6 +33,15 @@ export default {
       failureType: null,
     };
   },
+  // This is not the best practice, don't copy me (@samdbeckham)
+  // This is a temporary workaround to unblock a release.
+  // See this comment for more information on this approach
+  // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65972#note_626095648
+  apollo: {
+    currentBranch: {
+      query: getCurrentBranch,
+    },
+  },
   computed: {
     fileGlobalId() {
       return `${this.ciConfigPath}-${uniqueId()}`;
@@ -31,24 +49,44 @@ export default {
     mergedYaml() {
       return this.ciConfigData.mergedYaml;
     },
+    isOnDefaultBranch() {
+      return this.currentBranch === this.defaultBranch;
+    },
+    expandedConfigHelpPath() {
+      return helpPagePath('ci/pipeline_editor/index', { anchor: 'view-expanded-configuration' });
+    },
   },
 };
 </script>
 <template>
   <div>
-    <div class="gl-display-flex gl-align-items-center">
-      <gl-icon :size="16" name="lock" class="gl-text-gray-500 gl-mr-3" />
-      {{ $options.i18n.viewOnlyMessage }}
-    </div>
-    <div class="gl-mt-3 gl-border-solid gl-border-gray-100 gl-border-1">
-      <source-editor
-        ref="editor"
-        :value="mergedYaml"
-        :file-name="ciConfigPath"
-        :file-global-id="fileGlobalId"
-        :editor-options="{ readOnly: true }"
-        v-on="$listeners"
-      />
+    <div v-if="isOnDefaultBranch">
+      <div class="gl-display-flex gl-align-items-center">
+        <gl-icon :size="16" name="lock" class="gl-text-gray-500 gl-mr-3" />
+        {{ $options.i18n.viewOnlyMessage }}
+      </div>
+      <div class="gl-mt-3 gl-border-solid gl-border-gray-100 gl-border-1">
+        <source-editor
+          ref="editor"
+          :value="mergedYaml"
+          :file-name="ciConfigPath"
+          :file-global-id="fileGlobalId"
+          :editor-options="{ readOnly: true }"
+          v-on="$listeners"
+        />
+      </div>
     </div>
+    <gl-alert
+      v-else
+      variant="info"
+      :dismissible="false"
+      :title="$options.i18n.unavailableDefaultTitle"
+    >
+      <gl-sprintf :message="$options.i18n.unavailableDefaultText">
+        <template #link="{ content }">
+          <gl-link :href="expandedConfigHelpPath" target="_blank">{{ content }}</gl-link>
+        </template>
+      </gl-sprintf>
+    </gl-alert>
   </div>
 </template>
diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md
index 6e0ba8fa33feebd025da44dce2879d7a3fd4ed9b..949cfeb319d6bb270d0188a1b5648c115e23928b 100644
--- a/doc/ci/pipeline_editor/index.md
+++ b/doc/ci/pipeline_editor/index.md
@@ -85,6 +85,9 @@ where:
   [extended configuration merged into the job](../yaml/index.md#merge-details).
 - YAML anchors are [replaced with the linked configuration](../yaml/index.md#anchors).
 
+NOTE:
+You can only see the expanded view when editing the [default branch](../../user/project/repository/branches/default.md).
+
 ## Commit changes to CI configuration
 
 The commit form appears at the bottom of each tab in the editor so you can commit
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 4645aeb1abba912eb8642f11376d0c42957ea1d7..eee9af5f627b94325525dd39c3589c974d3c76fd 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -24221,6 +24221,9 @@ msgstr ""
 msgid "Pipelines|Merged YAML is view only"
 msgstr ""
 
+msgid "Pipelines|Merged YAML unavailable"
+msgstr ""
+
 msgid "Pipelines|More Information"
 msgstr ""
 
@@ -24257,6 +24260,9 @@ msgstr ""
 msgid "Pipelines|The GitLab CI configuration could not be updated."
 msgstr ""
 
+msgid "Pipelines|The merged YAML view is only available for the default branch. %{linkStart}Learn more.%{linkEnd}"
+msgstr ""
+
 msgid "Pipelines|There are currently no finished pipelines."
 msgstr ""
 
diff --git a/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js b/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js
index 7dd8a77d055756e90a5943109b80197a6aee2751..b797a664b751cab82167428fb463d5ae86da6293 100644
--- a/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js
+++ b/spec/frontend/pipeline_editor/components/editor/ci_config_merged_preview_spec.js
@@ -1,10 +1,12 @@
-import { GlIcon } from '@gitlab/ui';
+import { GlIcon, GlAlert } from '@gitlab/ui';
 import { shallowMount } from '@vue/test-utils';
 
 import { EDITOR_READY_EVENT } from '~/editor/constants';
 import CiConfigMergedPreview from '~/pipeline_editor/components/editor/ci_config_merged_preview.vue';
 import { mockLintResponse, mockCiConfigPath } from '../../mock_data';
 
+const DEFAULT_BRANCH = 'main';
+
 describe('Text editor component', () => {
   let wrapper;
 
@@ -16,7 +18,7 @@ describe('Text editor component', () => {
     },
   };
 
-  const createComponent = ({ props = {} } = {}) => {
+  const createComponent = ({ props = {}, currentBranch = DEFAULT_BRANCH } = {}) => {
     wrapper = shallowMount(CiConfigMergedPreview, {
       propsData: {
         ciConfigData: mockLintResponse,
@@ -24,20 +26,45 @@ describe('Text editor component', () => {
       },
       provide: {
         ciConfigPath: mockCiConfigPath,
+        defaultBranch: DEFAULT_BRANCH,
       },
       stubs: {
         SourceEditor: MockSourceEditor,
       },
+      data() {
+        return {
+          currentBranch,
+        };
+      },
     });
   };
 
   const findIcon = () => wrapper.findComponent(GlIcon);
+  const findAlert = () => wrapper.findComponent(GlAlert);
   const findEditor = () => wrapper.findComponent(MockSourceEditor);
 
   afterEach(() => {
     wrapper.destroy();
   });
 
+  // This is testing a temporary feature.
+  // It may be slightly hacky code that doesn't follow best practice.
+  // See the related MR for more information.
+  // https://gitlab.com/gitlab-org/gitlab/-/merge_requests/65972#note_626095644
+  describe('on a non-default branch', () => {
+    beforeEach(() => {
+      createComponent({ currentBranch: 'feature' });
+    });
+
+    it('does not load the editor', () => {
+      expect(findEditor().exists()).toBe(false);
+    });
+
+    it('renders an informational alert', () => {
+      expect(findAlert().exists()).toBe(true);
+    });
+  });
+
   describe('when status is valid', () => {
     beforeEach(() => {
       createComponent();