Repository: VirtusLab/git-machete
Pull request #1417 (2025-03-27 10:47:36)

Add new values to `machete.github.prDescriptionIntroStyle`

codecov-commenter: ## [Codecov](https://app.codecov.io/gh/VirtusLab/git-machete/pull/1417?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VirtusLab) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 98.52%. Comparing base [(`2272c57`)](https://app.codecov.io/gh/VirtusLab/git-machete/commit/2272c57f8568ff10b4da245fe280794b8e945746?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VirtusLab) to head [(`e3ec2cf`)](https://app.codecov.io/gh/VirtusLab/git-machete/commit/e3ec2cfaf8b02dbb00ddc0889238cd3069c9564b?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VirtusLab).

<details><summary>Additional details and impacted files</summary>


```diff
@@           Coverage Diff            @@
##           develop    #1417   +/-   ##
========================================
  Coverage    98.51%   98.52%           
========================================
  Files           14       14           
  Lines         4049     4055    +6     
  Branches       789      791    +2     
========================================
+ Hits          3989     3995    +6     
  Misses          38       38           
  Partials        22       22           
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/VirtusLab/git-machete/pull/1417?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VirtusLab).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=VirtusLab).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>

Patch:
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index b0b9ab8..4c86b09 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,7 +1,8 @@
 # Release notes
 
-## New in git-machete 3.33.1
+## New in git-machete 3.34.0
 
+- added: new `full-no-branches` and `up-only-no-branches` values to `machete.github.prDescriptionIntroStyle` and `machete.gitlab.mrDescriptionIntroStyle` git config keys
 - fixed: preserve trailing lines when updating PR/MR descriptions
 - fixed: generated sections of GitLab MRs include MR titles (as in GitHub PRs)
 
diff --git a/ci/checks/enforce-release-notes-up-to-date.sh b/ci/checks/enforce-release-notes-up-to-date.sh
index 536680d..ff4acc8 100755
--- a/ci/checks/enforce-release-notes-up-to-date.sh
+++ b/ci/checks/enforce-release-notes-up-to-date.sh
@@ -6,6 +6,6 @@ current_version=$(cut -d\' -f2 git_machete/__init__.py)
 release_notes_version=$(sed '3!d' RELEASE_NOTES.md | grep -Eo '(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))+')
 
 if [[ $current_version != "$release_notes_version" ]]; then
-  echo "Please update RELEASE_NOTES.md! Current version: $current_version, latest version in RELEASE_NOTES.md (line 3): $release_notes_version."
+  echo "Please update RELEASE_NOTES.md! Current version in git_machete/__init__.py: $current_version, latest version in RELEASE_NOTES.md (line 3): $release_notes_version."
   exit 1
 fi
diff --git a/docs/man/git-machete.1 b/docs/man/git-machete.1
index 62d60b5..a3b5102 100644
--- a/docs/man/git-machete.1
+++ b/docs/man/git-machete.1
@@ -27,9 +27,9 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "GIT-MACHETE" "1" "Mar 08, 2025" "" "git-machete"
+.TH "GIT-MACHETE" "1" "Mar 27, 2025" "" "git-machete"
 .SH NAME
-git-machete \- git-machete 3.33.1
+git-machete \- git-machete 3.34.0
 .sp
 git machete is a robust tool that \fBsimplifies your git workflows\fP\&.
 .sp
@@ -366,11 +366,15 @@ from the message body of the first unique commit of the branch, even if \fB\&.gi
 .B Select the style of the generated section (\(dqintro\(dq) added to the PR description:
 .INDENT 7.0
 .IP \(bu 2
-\fBfull\fP    \-\-\- include both a chain of upstream PRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream PRs
+\fBfull\fP                \-\-\- include both a chain of upstream PRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream PRs
 .IP \(bu 2
-\fBup\-only\fP \-\-\- default, include only a chain of upstream PRs
+\fBfull\-no\-branches\fP    \-\-\- same as \fBfull\fP, but no branch names are included (only PR numbers & titles)
 .IP \(bu 2
-\fBnone\fP    \-\-\- prepend no intro to the PR description at all
+\fBup\-only\fP             \-\-\- default, include only a chain of upstream PRs
+.IP \(bu 2
+\fBup\-only\-no\-branches\fP \-\-\- same as \fBup\-only\fP, but no branch names are included (only PR numbers & titles)
+.IP \(bu 2
+\fBnone\fP                \-\-\- prepend no intro to the PR description at all
 .UNINDENT
 .UNINDENT
 .TP
@@ -412,11 +416,15 @@ from the message body of the first unique commit of the branch, even if \fB\&.gi
 .B Select the style of the generated section (\(dqintro\(dq) added to the MR description:
 .INDENT 7.0
 .IP \(bu 2
-\fBfull\fP    \-\-\- include both a chain of upstream MRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream MRs
+\fBfull\fP                \-\-\- include both a chain of upstream MRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream MRs
+.IP \(bu 2
+\fBfull\-no\-branches\fP    \-\-\- same as \fBfull\fP, but no branch names are included (only MR numbers & titles)
+.IP \(bu 2
+\fBup\-only\fP             \-\-\- default, include only a chain of upstream MRs
 .IP \(bu 2
-\fBup\-only\fP \-\-\- default, include only a chain of upstream MRs
+\fBup\-only\-no\-branches\fP \-\-\- same as \fBup\-only\fP, but no branch names are included (only MR numbers & titles)
 .IP \(bu 2
-\fBnone\fP    \-\-\- prepend no intro to the MR description at all
+\fBnone\fP                \-\-\- prepend no intro to the MR description at all
 .UNINDENT
 .UNINDENT
 .TP
@@ -1108,8 +1116,8 @@ Update PR descriptions for all PRs opened by the current user associated with th
 .TP
 .B  \-\-related
 Update PR descriptions for all PRs that are upstream and/or downstream of the PR for the current branch.
-If \fBmachete.github.prDescriptionIntroStyle\fP is \fBup\-only\fP (default), then only downstream PR descriptions are updated.
-If \fBmachete.github.prDescriptionIntroStyle\fP is \fBfull\fP, then both downstream and upstream PR descriptions are updated.
+If \fBmachete.github.prDescriptionIntroStyle\fP is \fBup\-only\fP (default) or \fBup\-only\-no\-branches\fP, then only downstream PR descriptions are updated.
+If \fBmachete.github.prDescriptionIntroStyle\fP is \fBfull\fP or \fBfull\-no\-branches\fP, then both downstream and upstream PR descriptions are updated.
 .UNINDENT
 .UNINDENT
 .sp
@@ -1156,11 +1164,15 @@ from the message body of the first unique commit of the branch, even if \fB\&.gi
 .B Select the style of the generated section (\(dqintro\(dq) added to the PR description:
 .INDENT 7.0
 .IP \(bu 2
-\fBfull\fP    \-\-\- include both a chain of upstream PRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream PRs
+\fBfull\fP                \-\-\- include both a chain of upstream PRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream PRs
 .IP \(bu 2
-\fBup\-only\fP \-\-\- default, include only a chain of upstream PRs
+\fBfull\-no\-branches\fP    \-\-\- same as \fBfull\fP, but no branch names are included (only PR numbers & titles)
 .IP \(bu 2
-\fBnone\fP    \-\-\- prepend no intro to the PR description at all
+\fBup\-only\fP             \-\-\- default, include only a chain of upstream PRs
+.IP \(bu 2
+\fBup\-only\-no\-branches\fP \-\-\- same as \fBup\-only\fP, but no branch names are included (only PR numbers & titles)
+.IP \(bu 2
+\fBnone\fP                \-\-\- prepend no intro to the PR description at all
 .UNINDENT
 .UNINDENT
 .UNINDENT
@@ -1420,11 +1432,15 @@ from the message body of the first unique commit of the branch, even if \fB\&.gi
 .B Select the style of the generated section (\(dqintro\(dq) added to the MR description:
 .INDENT 7.0
 .IP \(bu 2
-\fBfull\fP    \-\-\- include both a chain of upstream MRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream MRs
+\fBfull\fP                \-\-\- include both a chain of upstream MRs (typically leading to \fBmain\fP, \fBmaster\fP, \fBdevelop\fP etc.) and a tree of downstream MRs
+.IP \(bu 2
+\fBfull\-no\-branches\fP    \-\-\- same as \fBfull\fP, but no branch names are included (only MR numbers & titles)
+.IP \(bu 2
+\fBup\-only\fP             \-\-\- default, include only a chain of upstream MRs
 .IP \(bu 2
-\fBup\-only\fP \-\-\- default, include only a chain of upstream MRs
+\fBup\-only\-no\-branches\fP \-\-\- same as \fBup\-only\fP, but no branch names are included (only MR numbers & titles)
 .IP \(bu 2
-\fBnone\fP    \-\-\- prepend no intro to the MR description at all
+\fBnone\fP                \-\-\- prepend no intro to the MR description at all
 .UNINDENT
 .UNINDENT
 .UNINDENT
diff --git a/docs/source/cli/github.rst b/docs/source/cli/github.rst
index a8d894a..f75e52d 100644
--- a/docs/source/cli/github.rst
+++ b/docs/source/cli/github.rst
@@ -159,8 +159,8 @@ Creates, checks out and manages GitHub PRs while keeping them reflected in branc
     --mine               Update PR descriptions for all PRs opened by the current user associated with the GitHub token.
 
     --related            Update PR descriptions for all PRs that are upstream and/or downstream of the PR for the current branch.
-                         If ``machete.github.prDescriptionIntroStyle`` is ``up-only`` (default), then only downstream PR descriptions are updated.
-                         If ``machete.github.prDescriptionIntroStyle`` is ``full``, then both downstream and upstream PR descriptions are updated.
+                         If ``machete.github.prDescriptionIntroStyle`` is ``up-only`` (default) or ``up-only-no-branches``, then only downstream PR descriptions are updated.
+                         If ``machete.github.prDescriptionIntroStyle`` is ``full`` or ``full-no-branches``, then both downstream and upstream PR descriptions are updated.
 
 **Git config keys:**
 
diff --git a/docs/source/cli/gitlab.rst b/docs/source/cli/gitlab.rst
index a5a1ba8..52ba849 100644
--- a/docs/source/cli/gitlab.rst
+++ b/docs/source/cli/gitlab.rst
@@ -150,8 +150,8 @@ Creates, checks out and manages GitLab MRs while keeping them reflected in branc
     --mine               Update MR descriptions for all MRs opened by the current user associated with the GitLab token.
 
     --related            Update MR descriptions for all MRs that are upstream and/or downstream of the MR for the current branch.
-                         If ``machete.gitlab.mrDescriptionIntroStyle`` is ``up-only`` (default), then only downstream MR descriptions are updated.
-                         If ``machete.gitlab.mrDescriptionIntroStyle`` is ``full``, then both downstream and upstream MR descriptions are updated.
+                         If ``machete.gitlab.mrDescriptionIntroStyle`` is ``up-only`` (default) or ``up-only-no-branches``, then only downstream MR descriptions are updated.
+                         If ``machete.gitlab.mrDescriptionIntroStyle`` is ``full`` or ``full-no-branches``, then both downstream and upstream MR descriptions are updated.
 
 **Git config keys:**
 
diff --git a/docs/source/git-config-keys/github_prDescriptionIntroStyle.rst b/docs/source/git-config-keys/github_prDescriptionIntroStyle.rst
index ea149d9..8a9ca94 100644
--- a/docs/source/git-config-keys/github_prDescriptionIntroStyle.rst
+++ b/docs/source/git-config-keys/github_prDescriptionIntroStyle.rst
@@ -1,4 +1,6 @@
 Select the style of the generated section ("intro") added to the PR description:
-  * ``full``    --- include both a chain of upstream PRs (typically leading to ``main``, ``master``, ``develop`` etc.) and a tree of downstream PRs
-  * ``up-only`` --- default, include only a chain of upstream PRs
-  * ``none``    --- prepend no intro to the PR description at all
+  * ``full``                --- include both a chain of upstream PRs (typically leading to ``main``, ``master``, ``develop`` etc.) and a tree of downstream PRs
+  * ``full-no-branches``    --- same as ``full``, but no branch names are included (only PR numbers & titles)
+  * ``up-only``             --- default, include only a chain of upstream PRs
+  * ``up-only-no-branches`` --- same as ``up-only``, but no branch names are included (only PR numbers & titles)
+  * ``none``                --- prepend no intro to the PR description at all
diff --git a/docs/source/git-config-keys/gitlab_mrDescriptionIntroStyle.rst b/docs/source/git-config-keys/gitlab_mrDescriptionIntroStyle.rst
index d19a8e4..7628789 100644
--- a/docs/source/git-config-keys/gitlab_mrDescriptionIntroStyle.rst
+++ b/docs/source/git-config-keys/gitlab_mrDescriptionIntroStyle.rst
@@ -1,4 +1,6 @@
 Select the style of the generated section ("intro") added to the MR description:
-  * ``full``    --- include both a chain of upstream MRs (typically leading to ``main``, ``master``, ``develop`` etc.) and a tree of downstream MRs
-  * ``up-only`` --- default, include only a chain of upstream MRs
-  * ``none``    --- prepend no intro to the MR description at all
+  * ``full``                --- include both a chain of upstream MRs (typically leading to ``main``, ``master``, ``develop`` etc.) and a tree of downstream MRs
+  * ``full-no-branches``    --- same as ``full``, but no branch names are included (only MR numbers & titles)
+  * ``up-only``             --- default, include only a chain of upstream MRs
+  * ``up-only-no-branches`` --- same as ``up-only``, but no branch names are included (only MR numbers & titles)
+  * ``none``                --- prepend no intro to the MR description at all
diff --git a/git_machete/__init__.py b/git_machete/__init__.py
index ca34d0b..9a3e995 100644
--- a/git_machete/__init__.py
+++ b/git_machete/__init__.py
@@ -1,1 +1,1 @@
-__version__ = '3.33.1'
+__version__ = '3.34.0'
diff --git a/git_machete/client.py b/git_machete/client.py
index 1aa9c1b..c179375 100644
--- a/git_machete/client.py
+++ b/git_machete/client.py
@@ -77,7 +77,9 @@ class PickRoot(Enum):
 
 class PRDescriptionIntroStyle(ParsableEnum):
     FULL = auto()
+    FULL_NO_BRANCHES = auto()
     UP_ONLY = auto()
+    UP_ONLY_NO_BRANCHES = auto()
     NONE = auto()
 
 
@@ -2443,7 +2445,7 @@ class MacheteClient:
         elif related_to:
             style = self.__get_pr_description_into_style_from_config()
             result = []
-            if style == PRDescriptionIntroStyle.FULL:
+            if style in (PRDescriptionIntroStyle.FULL, PRDescriptionIntroStyle.FULL_NO_BRANCHES):
                 result += reversed(self.__get_upwards_path_including_pr(related_to))
             result += [pr_ for pr_, _ in self.__get_downwards_tree_excluding_pr(related_to)]
             return result
@@ -2771,14 +2773,14 @@ class MacheteClient:
             # As a slight optimization, in the default UP_ONLY style,
             # let's fetch the full PR list only if the current PR has a base PR at all.
             prs_for_base_branch = self.code_hosting_client.get_open_pull_requests_by_head(LocalBranchShortName(pr.base))
-        if style == PRDescriptionIntroStyle.UP_ONLY and len(prs_for_base_branch) == 0:
+        if style in (PRDescriptionIntroStyle.UP_ONLY, PRDescriptionIntroStyle.UP_ONLY_NO_BRANCHES) and len(prs_for_base_branch) == 0:
             return ''
         spec = self.code_hosting_spec
         pr_short_name = spec.pr_short_name
         br_before_branches = ' <br>' if spec.pr_intro_br_before_branches else ''
 
         pr_up_path = list(reversed(self.__get_upwards_path_including_pr(pr)))
-        if style == PRDescriptionIntroStyle.FULL:
+        if style in (PRDescriptionIntroStyle.FULL, PRDescriptionIntroStyle.FULL_NO_BRANCHES):
             pr_down_tree = self.__get_downwards_tree_excluding_pr(pr)
         else:
             pr_down_tree = []
@@ -2803,12 +2805,18 @@ class MacheteClient:
             result = '  ' * _depth
             display_text = _pr.display_text(fmt=False)
             explicit_title = f' _{_pr.title}_' if spec.pr_intro_explicit_title else ''
-            if _pr.number == pr.number:
-                result += f'* **{display_text}{explicit_title} (THIS ONE)**:{br_before_branches}\n'
+            if style in (PRDescriptionIntroStyle.UP_ONLY, PRDescriptionIntroStyle.FULL):
+                if _pr.number == pr.number:
+                    result += f'* **{display_text}{explicit_title} (THIS ONE)**:{br_before_branches}\n'
+                else:
+                    result += f'* {display_text}{explicit_title}:{br_before_branches}\n'
+                result += '  ' * _depth
+                result += f'  `{_pr.base}` ← `{_pr.head}`\n\n'
             else:
-                result += f'* {display_text}{explicit_title}:{br_before_branches}\n'
-            result += '  ' * _depth
-            result += f'  `{_pr.base}` ← `{_pr.head}`\n\n'
+                if _pr.number == pr.number:
+                    result += f'* **{display_text}{explicit_title} (THIS ONE)**\n\n'
+                else:
+                    result += f'* {display_text}{explicit_title}\n\n'
             return result
 
         base_depth = 0
@@ -2930,7 +2938,7 @@ class MacheteClient:
         # If base branch has NOT originally been found on the remote,
         # we can be sure that a longer chain of PRs above the newly-created PR does NOT exist.
         # So in the default UP_ONLY mode, we can skip generating the intro completely.
-        if base_branch_found_on_remote or style == PRDescriptionIntroStyle.FULL:
+        if base_branch_found_on_remote or style in (PRDescriptionIntroStyle.FULL, PRDescriptionIntroStyle.FULL_NO_BRANCHES):
             # As the description may include the reference to this PR itself (in case of a chain of >=2 PRs),
             # let's update the PR description after it's already created (so that we know the current PR's number).
             new_description = self.__get_updated_pull_request_description(pr)
diff --git a/git_machete/generated_docs.py b/git_machete/generated_docs.py
index 36fcfcf..311ce65 100644
--- a/git_machete/generated_docs.py
+++ b/git_machete/generated_docs.py
@@ -253,11 +253,15 @@ long_docs: Dict[str, str] = {
 
                  Select the style of the generated section ("intro") added to the PR description:
 
-                 * `full`    — include both a chain of upstream PRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream PRs
+                 * `full`                — include both a chain of upstream PRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream PRs
 
-                 * `up-only` — default, include only a chain of upstream PRs
+                 * `full-no-branches`    — same as `full`, but no branch names are included (only PR numbers & titles)
 
-                 * `none`    — prepend no intro to the PR description at all
+                 * `up-only`             — default, include only a chain of upstream PRs
+
+                 * `up-only-no-branches` — same as `up-only`, but no branch names are included (only PR numbers & titles)
+
+                 * `none`                — prepend no intro to the PR description at all
 
            `machete.gitlab.{domain,remote,namespace,project}`:
 
@@ -290,11 +294,15 @@ long_docs: Dict[str, str] = {
 
                  Select the style of the generated section ("intro") added to the MR description:
 
-                 * `full`    — include both a chain of upstream MRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream MRs
+                 * `full`                — include both a chain of upstream MRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream MRs
+
+                 * `full-no-branches`    — same as `full`, but no branch names are included (only MR numbers & titles)
+
+                 * `up-only`             — default, include only a chain of upstream MRs
 
-                 * `up-only` — default, include only a chain of upstream MRs
+                 * `up-only-no-branches` — same as `up-only`, but no branch names are included (only MR numbers & titles)
 
-                 * `none`    — prepend no intro to the MR description at all
+                 * `none`                — prepend no intro to the MR description at all
 
            `machete.overrideForkPoint.<branch>.to`:
  
@@ -748,8 +756,8 @@ long_docs: Dict[str, str] = {
 
                  <b>--related</b>
               Update PR descriptions for all PRs that are upstream and/or downstream of the PR for the current branch.
-              If `machete.github.prDescriptionIntroStyle` is `up-only` (default), then only downstream PR descriptions are updated.
-              If `machete.github.prDescriptionIntroStyle` is `full`, then both downstream and upstream PR descriptions are updated.
+              If `machete.github.prDescriptionIntroStyle` is `up-only` (default) or `up-only-no-branches`, then only downstream PR descriptions are updated.
+              If `machete.github.prDescriptionIntroStyle` is `full` or `full-no-branches`, then both downstream and upstream PR descriptions are updated.
 
         <b>Git config keys:</b>
            `machete.github.{domain,remote,organization,repository}` (all subcommands):
@@ -786,11 +794,15 @@ long_docs: Dict[str, str] = {
 
                  Select the style of the generated section ("intro") added to the PR description:
 
-                 * `full`    — include both a chain of upstream PRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream PRs
+                 * `full`                — include both a chain of upstream PRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream PRs
 
-                 * `up-only` — default, include only a chain of upstream PRs
+                 * `full-no-branches`    — same as `full`, but no branch names are included (only PR numbers & titles)
 
-                 * `none`    — prepend no intro to the PR description at all
+                 * `up-only`             — default, include only a chain of upstream PRs
+
+                 * `up-only-no-branches` — same as `up-only`, but no branch names are included (only PR numbers & titles)
+
+                 * `none`                — prepend no intro to the PR description at all
 
         <b>Environment variables (all subcommands):</b>
            `GITHUB_TOKEN`
@@ -1005,11 +1017,15 @@ long_docs: Dict[str, str] = {
 
                  Select the style of the generated section ("intro") added to the MR description:
 
-                 * `full`    — include both a chain of upstream MRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream MRs
+                 * `full`                — include both a chain of upstream MRs (typically leading to `main`, `master`, `develop` etc.) and a tree of downstream MRs
+
+                 * `full-no-branches`    — same as `full`, but no branch names are included (only MR numbers & titles)
+
+                 * `up-only`             — default, include only a chain of upstream MRs
 
-                 * `up-only` — default, include only a chain of upstream MRs
+                 * `up-only-no-branches` — same as `up-only`, but no branch names are included (only MR numbers & titles)
 
-                 * `none`    — prepend no intro to the MR description at all
+                 * `none`                — prepend no intro to the MR description at all
 
         <b>Environment variables (all subcommands):</b>
            `GITLAB_TOKEN`


Test patch:
diff --git a/tests/test_github_update_pr_descriptions.py b/tests/test_github_update_pr_descriptions.py
index 1675601..9c2a6f9 100644
--- a/tests/test_github_update_pr_descriptions.py
+++ b/tests/test_github_update_pr_descriptions.py
@@ -4,7 +4,7 @@ from typing import Any, Dict, List
 from pytest_mock import MockerFixture
 
 from tests.base_test import BaseTest
-from tests.mockers import (assert_failure, assert_success,
+from tests.mockers import (assert_failure, assert_success, launch_command,
                            rewrite_branch_layout_file)
 from tests.mockers_code_hosting import mock_from_url
 from tests.mockers_git_repository import (check_out, commit,
@@ -201,6 +201,54 @@ class TestGitHubUpdatePRDescriptions(BaseTest):
         assert pr is not None
         assert pr['body'] == "# Summary"
 
+        set_git_config_key("machete.github.prDescriptionIntroStyle", "up-only-no-branches")
+
+        launch_command('github', 'update-pr-descriptions', '--all')
+        pr = github_api_state.get_pull_by_number(12)
+        assert pr is not None
+        assert pr['body'] == textwrap.dedent("""
+            <!-- start git-machete generated -->
+
+            # Based on PR #6
+
+            ## Chain of upstream PRs as of 2023-12-31
+
+            * PR #6
+
+              * **PR #12 (THIS ONE)**
+
+            <!-- end git-machete generated -->
+
+            # Summary
+
+        """)[1:]
+
+        set_git_config_key("machete.github.prDescriptionIntroStyle", "full-no-branches")
+
+        launch_command('github', 'update-pr-descriptions', '--all')
+        pr = github_api_state.get_pull_by_number(12)
+        assert pr is not None
+        assert pr['body'] == textwrap.dedent("""
+            <!-- start git-machete generated -->
+
+            # Based on PR #6
+
+            ## Chain of upstream PRs & tree of downstream PRs as of 2023-12-31
+
+            * PR #6
+
+              * **PR #12 (THIS ONE)**
+
+                  * PR #17
+
+                    * PR #18
+
+            <!-- end git-machete generated -->
+
+            # Summary
+
+        """)[1:]
+
     def test_github_update_pr_descriptions_misc_failures_and_warns(self, mocker: MockerFixture) -> None:
         self.patch_symbol(mocker, 'git_machete.code_hosting.OrganizationAndRepository.from_url', mock_from_url)
         self.patch_symbol(mocker, 'urllib.request.urlopen', mock_urlopen(MockGitHubAPIState.with_prs()))
diff --git a/tests/test_gitlab_update_mr_descriptions.py b/tests/test_gitlab_update_mr_descriptions.py
index 6803952..5ffb2f0 100644
--- a/tests/test_gitlab_update_mr_descriptions.py
+++ b/tests/test_gitlab_update_mr_descriptions.py
@@ -4,7 +4,7 @@ from typing import Any, Dict, List
 from pytest_mock import MockerFixture
 
 from tests.base_test import BaseTest
-from tests.mockers import (assert_failure, assert_success,
+from tests.mockers import (assert_failure, assert_success, launch_command,
                            rewrite_branch_layout_file)
 from tests.mockers_code_hosting import mock_from_url
 from tests.mockers_git_repository import (check_out, commit,
@@ -201,6 +201,54 @@ class TestGitLabUpdateMRDescriptions(BaseTest):
         assert mr is not None
         assert mr['description'] == "# Summary"
 
+        set_git_config_key("machete.gitlab.mrDescriptionIntroStyle", "up-only-no-branches")
+
+        launch_command('gitlab', 'update-mr-descriptions', '--all')
+        mr = gitlab_api_state.get_mr_by_number(12)
+        assert mr is not None
+        assert mr['description'] == textwrap.dedent("""
+            <!-- start git-machete generated -->
+
+            # Based on MR !6
+
+            ## Chain of upstream MRs as of 2023-12-31
+
+            * MR !6 _MR title_
+
+              * **MR !12 _MR title_ (THIS ONE)**
+
+            <!-- end git-machete generated -->
+
+            # Summary
+
+        """)[1:]
+
+        set_git_config_key("machete.gitlab.mrDescriptionIntroStyle", "full-no-branches")
+
+        launch_command('gitlab', 'update-mr-descriptions', '--all')
+        mr = gitlab_api_state.get_mr_by_number(12)
+        assert mr is not None
+        assert mr['description'] == textwrap.dedent("""
+            <!-- start git-machete generated -->
+
+            # Based on MR !6
+
+            ## Chain of upstream MRs & tree of downstream MRs as of 2023-12-31
+
+            * MR !6 _MR title_
+
+              * **MR !12 _MR title_ (THIS ONE)**
+
+                  * MR !17 _MR title_
+
+                    * MR !18 _MR title_
+
+            <!-- end git-machete generated -->
+
+            # Summary
+
+        """)[1:]
+
     def test_gitlab_update_mr_descriptions_misc_failures_and_warns(self, mocker: MockerFixture) -> None:
         self.patch_symbol(mocker, 'git_machete.code_hosting.OrganizationAndRepository.from_url', mock_from_url)
         self.patch_symbol(mocker, 'urllib.request.urlopen', mock_urlopen(MockGitLabAPIState.with_mrs()))