[flutter_tools] Provide global options with subcommand help text (#54884)

diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index 852fc62..e6dfe4e 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -848,6 +848,23 @@
     }
   }
 
+  @override
+  String get usage {
+    final String usageWithoutDescription = super.usage.substring(
+      // The description plus two newlines.
+      description.length + 2,
+    );
+    final String help = <String>[
+      description,
+      '',
+      'Global options:',
+      runner.argParser.usage,
+      '',
+      usageWithoutDescription,
+    ].join('\n');
+    return help;
+  }
+
   ApplicationPackageStore applicationPackages;
 
   /// Gets the parsed command-line option named [name] as `bool`.
diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart
index ca7b5fd..a66eb03 100644
--- a/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart
+++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_test.dart
@@ -42,6 +42,12 @@
       when(mockProcessInfo.maxRss).thenReturn(10);
     });
 
+    testUsingContext('help text contains global options', () {
+      final FakeCommand fake = FakeCommand();
+      createTestCommandRunner(fake);
+      expect(fake.usage, contains('Global options:\n'));
+    });
+
     testUsingContext('honors shouldUpdateCache false', () async {
       final DummyFlutterCommand flutterCommand = DummyFlutterCommand(shouldUpdateCache: false);
       await flutterCommand.run();
@@ -423,10 +429,9 @@
   });
 }
 
-
 class FakeCommand extends FlutterCommand {
   @override
-  String get description => null;
+  String get description => 'A fake command';
 
   @override
   String get name => 'fake';