Repository: CLIUtils/CLI11 (C++)

Issue:
When I use add_option_group, some redundant information will be displayed in the 'help message'.
For example, consider the following program:
```
auto *group1 = testOption.add_option_group("outGroup");
auto *group2 = testOption.add_option_group("inGroup");

std::string outFile("");
group1->add_option("--outfile,-o", outFile,
"specify the file location of the output")->required();

std::string inFile("");
group2
->add_option("--infile,-i", inFile,
"specify the file location of the input")
->required();
CLI11_PARSE(testOption, argc, argv);
```

Running this with `./test -h` correctly returns:

```
[Option Group: outGroup]
Options:
-o,--outfile TEXT REQUIRED specify the file location of the output
[Option Group: inGroup]
Options:
-i,--infile TEXT REQUIRED specify the file location of the input

outGroup:

inGroup:
```
In the end of the above information, what are `outGroup: ` and `inGroup: ` ?
In `v2.3.1` , the message with `-h` is:

```
[Option Group: outGroup]
Options:
-o,--outfile TEXT REQUIRED specify the file location of the output
[Option Group: inGroup]
Options:
-i,--infile TEXT REQUIRED specify the file location of the input
```


Discussion:

Patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index be0dec5b8..b04bc8d3b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -26,7 +26,7 @@ repos:
       - id: debug-statements
 
   - repo: https://github.com/pre-commit/mirrors-clang-format
-    rev: v18.1.6
+    rev: v18.1.8
     hooks:
       - id: clang-format
         types_or: [c++, c, cuda]
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index c2cbb7a55..98bdc3362 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -49,14 +49,17 @@ jobs:
         Linux14PC:
           vmImage: "ubuntu-latest"
           cli11.precompile: ON
+        macOS20:
+          vmImage: "macOS-14"
+          cli11.std: 20
         macOS17:
-          vmImage: "macOS-12"
+          vmImage: "macOS-13"
           cli11.std: 17
         macOS11:
-          vmImage: "macOS-11"
+          vmImage: "macOS-12"
           cli11.std: 11
-        macOS11PC:
-          vmImage: "macOS-11"
+        macOS12PC:
+          vmImage: "macOS-12"
           cli11.std: 11
           cli11.precompile: ON
         Windows17:
diff --git a/include/CLI/impl/Formatter_inl.hpp b/include/CLI/impl/Formatter_inl.hpp
index 2faba9e12..a5b8d043d 100644
--- a/include/CLI/impl/Formatter_inl.hpp
+++ b/include/CLI/impl/Formatter_inl.hpp
@@ -180,10 +180,10 @@ CLI11_INLINE std::string Formatter::make_subcommands(const App *app, AppFormatMo
     std::vector<std::string> subcmd_groups_seen;
     for(const App *com : subcommands) {
         if(com->get_name().empty()) {
-            if(com->get_group().empty() || com->get_group().front() == '+') {
-                continue;
+            if(!com->get_group().empty() && com->get_group().front() != '+') {
+                out << make_expanded(com);
             }
-            out << make_expanded(com);
+            continue;
         }
         std::string group_key = com->get_group();
         if(!group_key.empty() &&


Test patch:
diff --git a/tests/HelpTest.cpp b/tests/HelpTest.cpp
index 1b844c2fc..50b4cd426 100644
--- a/tests/HelpTest.cpp
+++ b/tests/HelpTest.cpp
@@ -273,6 +273,35 @@ TEST_CASE("THelp: HiddenGroup", "[help]") {
     CHECK_THAT(help, Contains("another"));
 }
 
+// from https://github.com/CLIUtils/CLI11/issues/1045
+TEST_CASE("THelp: multiple_group", "[help]") {
+    CLI::App app{"test_group"};
+    auto *group1 = app.add_option_group("outGroup");
+    auto *group2 = app.add_option_group("inGroup");
+
+    std::string outFile("");
+    group1->add_option("--outfile,-o", outFile, "specify the file location of the output")->required();
+
+    std::string inFile("");
+    group2->add_option("--infile,-i", inFile, "specify the file location of the input")->required();
+
+    auto help = app.help();
+    int inCount = 0;
+    int outCount = 0;
+    auto iFind = help.find("inGroup");
+    while(iFind != std::string::npos) {
+        ++inCount;
+        iFind = help.find("inGroup", iFind + 6);
+    }
+    auto oFind = help.find("outGroup");
+    while(oFind != std::string::npos) {
+        ++outCount;
+        oFind = help.find("outGroup", oFind + 6);
+    }
+    CHECK(inCount == 1);
+    CHECK(outCount == 1);
+}
+
 TEST_CASE("THelp: OptionalPositionalAndOptions", "[help]") {
     CLI::App app{"My prog", "AnotherProgram"};
     app.add_flag("-q,--quick");