{"id":75882,"date":"2026-05-14T07:08:01","date_gmt":"2026-05-14T07:08:01","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=75882"},"modified":"2026-05-14T07:08:04","modified_gmt":"2026-05-14T07:08:04","slug":"master-guide-how-to-link-github-issues-commits-branches-and-pull-requests-same-repo-and-cross-repo-workflow","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/master-guide-how-to-link-github-issues-commits-branches-and-pull-requests-same-repo-and-cross-repo-workflow\/","title":{"rendered":"Master Guide: How to Link GitHub Issues, Commits, Branches, and Pull Requests \u2014 Same Repo and Cross-Repo Workflow"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Introduction<\/h2>\n\n\n\n<p>In many teams, GitHub Issues, commits, branches, and pull requests are created in the <strong>same repository<\/strong>. That is the simple case.<\/p>\n\n\n\n<p>But your setup is more advanced and very common in real companies:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Central task\/ticket repo:\ndevops-school-com\/TaskManager\n\nCode repos:\ndevops-school-com\/frontend-repo\ndevops-school-com\/backend-repo\ndevops-school-com\/mobile-repo\n<\/code><\/span><\/pre>\n\n\n<p>Your ticket is maintained here:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>But the actual code changes may happen in other repositories.<\/p>\n\n\n\n<p>So the goal is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">TaskManager<\/span> <span class=\"hljs-selector-tag\">issue<\/span> <span class=\"hljs-selector-id\">#560<\/span>\n        \u2193\n<span class=\"hljs-selector-tag\">linked<\/span> <span class=\"hljs-selector-tag\">with<\/span> <span class=\"hljs-selector-tag\">branches<\/span>\n        \u2193\n<span class=\"hljs-selector-tag\">linked<\/span> <span class=\"hljs-selector-tag\">with<\/span> <span class=\"hljs-selector-tag\">commits<\/span>\n        \u2193\n<span class=\"hljs-selector-tag\">linked<\/span> <span class=\"hljs-selector-tag\">with<\/span> <span class=\"hljs-selector-tag\">pull<\/span> <span class=\"hljs-selector-tag\">requests<\/span>\n        \u2193\n<span class=\"hljs-selector-tag\">tracked<\/span> <span class=\"hljs-selector-tag\">across<\/span> <span class=\"hljs-selector-tag\">multiple<\/span> <span class=\"hljs-selector-tag\">repositories<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub supports this through issue\/PR references, closing keywords, commit message references, manual Development sidebar linking, and automation. GitHub automatically converts references to issues, pull requests, and commits into links in GitHub conversations and Markdown areas such as issue bodies, PR bodies, and comments. (<a href=\"https:\/\/docs.github.com\/en\/get-started\/writing-on-github\/working-with-advanced-formatting\/autolinked-references-and-urls\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Important GitHub Concepts<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">2.1 Issue<\/h2>\n\n\n\n<p>An <strong>Issue<\/strong> is usually used for a task, bug, feature request, or work item.<\/p>\n\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In your case, this is the central ticket.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2.2 Commit<\/h2>\n\n\n\n<p>A <strong>commit<\/strong> is an actual code change.<\/p>\n\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add login validation for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This message links the commit to the central TaskManager issue.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2.3 Branch<\/h2>\n\n\n\n<p>A <strong>branch<\/strong> is where a developer works before creating a PR.<\/p>\n\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b task-560-add-login-validation\n<\/code><\/span><\/pre>\n\n\n<p>Branch names do not automatically close or update issues, but good branch naming helps traceability.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2.4 Pull Request<\/h2>\n\n\n\n<p>A <strong>Pull Request<\/strong> is the review and merge request for code changes.<\/p>\n\n\n\n<p>Example PR title:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">login<\/span> <span class=\"hljs-selector-tag\">validation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Example PR body:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Related to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Closes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub can link a PR to an issue manually or by using supported keywords in the PR description. When a linked PR is merged into the default branch, GitHub can automatically close the linked issue. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Same-Repository Linking<\/h1>\n\n\n\n<p>This is the simplest case.<\/p>\n\n\n\n<p>Assume your issue and code are in the same repository:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Repository:\ndevops-school-com\/backend-repo\n\nIssue:\ndevops-school-com\/backend-repo<span class=\"hljs-comment\">#25<\/span>\n\nPR:\ndevops-school-com\/backend-repo<span class=\"hljs-comment\">#30<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3.1 Referencing an Issue in a Commit Message<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add payment validation for #25\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This creates a reference to issue <code>#25<\/code>.<\/p>\n\n\n\n<p>Better commit message:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">commit<\/span> <span class=\"hljs-selector-tag\">-m<\/span> \"<span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">payment<\/span> <span class=\"hljs-selector-tag\">validation<\/span>\n\n<span class=\"hljs-selector-tag\">Related<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-id\">#25<\/span>\"\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3.2 Referencing an Issue in a PR Body<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to <span class=\"hljs-comment\">#25<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added payment validation\n- Updated API response\n- Added validation tests\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This creates a clickable link from the PR to the issue.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3.3 Auto-Closing Same-Repo Issue from PR<\/h2>\n\n\n\n<p>Use one of GitHub\u2019s closing keywords:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Closes<\/span> <span class=\"hljs-selector-id\">#25<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Fixes<\/span> <span class=\"hljs-selector-id\">#25<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>or:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Resolves<\/span> <span class=\"hljs-selector-id\">#25<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Supported keywords include <code>close<\/code>, <code>closes<\/code>, <code>closed<\/code>, <code>fix<\/code>, <code>fixes<\/code>, <code>fixed<\/code>, <code>resolve<\/code>, <code>resolves<\/code>, and <code>resolved<\/code>. GitHub also supports uppercase and colon variants such as <code>CLOSES: #10<\/code>. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<p>Example PR body:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nCloses <span class=\"hljs-comment\">#25<\/span>\n\n<span class=\"hljs-comment\">## Summary<\/span>\n\n- Added payment validation\n- Added backend validation test cases\n- Updated error message\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>When this PR is merged into the default branch, GitHub will close issue <code>#25<\/code>. GitHub notes that these special keywords are interpreted only when the PR targets the repository\u2019s default branch. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Cross-Repository Linking: Your Real Scenario<\/h1>\n\n\n\n<p>Your case:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Central issue repo:\ndevops-school-com\/TaskManager\n\nIssue:\ndevops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\nCode repo:\ndevops-school-com\/backend-repo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In this case, do <strong>not<\/strong> use only:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-id\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Because <code>#560<\/code> inside <code>backend-repo<\/code> means:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/backend-repo<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>That is not your TaskManager issue.<\/p>\n\n\n\n<p>You must use the full cross-repo reference:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub supports issue references using <code>Username\/Repository#number<\/code> or <code>Organization\/Repository#number<\/code>. (<a href=\"https:\/\/docs.github.com\/en\/get-started\/writing-on-github\/working-with-advanced-formatting\/autolinked-references-and-urls\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Correct Cross-Repo Commit Message Examples<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">5.1 Simple Commit Reference<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add login validation for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.2 Better Multi-Line Commit Message<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git commit -m <span class=\"hljs-string\">\"Add login validation\n\nRelated to devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.3 Feature Commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Implement vehicle search filters for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.4 Bug Fix Commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Fix empty response handling for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.5 UI Commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Update dashboard card layout for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.6 API Commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add organization task API for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.7 Test Commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add unit tests for task filtering related to devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5.8 Documentation Commit<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Update setup guide for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Cross-Repo PR Description Examples<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">6.1 Safe Linking Without Auto-Close<\/h2>\n\n\n\n<p>Use this for most PRs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added backend validation\n- Updated API response structure\n- Added test coverage\n\n<span class=\"hljs-comment\">## Testing done<\/span>\n\n- Ran unit tests\n- Tested API manually\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This creates traceability but does not auto-close the issue.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.2 Auto-Close Cross-Repo Issue<\/h2>\n\n\n\n<p>Use this only when this PR fully completes the task:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nCloses devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Completed backend implementation\n- Added frontend integration\n- Added test coverage\n\n<span class=\"hljs-comment\">## Testing done<\/span>\n\n- Verified locally\n- Tested staging deployment\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For issues in a different repository, GitHub\u2019s documented syntax is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">KEYWORD OWNER\/REPOSITORY<span class=\"hljs-comment\">#ISSUE-NUMBER<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Fixes octo-org\/octo-repo<span class=\"hljs-comment\">#100<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For your case:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Fixes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>(<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Very Important: <code>Related to<\/code> vs <code>Closes<\/code><\/h1>\n\n\n\n<p>This is where many teams get confused.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Keyword<\/th><th>Meaning<\/th><th>Auto-closes issue?<\/th><th>Best use<\/th><\/tr><\/thead><tbody><tr><td><code>Related to devops-school-com\/TaskManager#560<\/code><\/td><td>Simple link\/reference<\/td><td>No<\/td><td>Normal multi-repo work<\/td><\/tr><tr><td><code>Refs devops-school-com\/TaskManager#560<\/code><\/td><td>Simple reference<\/td><td>No<\/td><td>Optional style<\/td><\/tr><tr><td><code>Fixes devops-school-com\/TaskManager#560<\/code><\/td><td>Final fix<\/td><td>Yes, after merge to default branch<\/td><td>Final PR<\/td><\/tr><tr><td><code>Closes devops-school-com\/TaskManager#560<\/code><\/td><td>Final closure<\/td><td>Yes, after merge to default branch<\/td><td>Final PR<\/td><\/tr><tr><td><code>Resolves devops-school-com\/TaskManager#560<\/code><\/td><td>Final resolution<\/td><td>Yes, after merge to default branch<\/td><td>Final PR<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For your 4-repo setup, use <code>Related to<\/code> in most PRs. Use <code>Closes<\/code>, <code>Fixes<\/code>, or <code>Resolves<\/code> only in the PR that truly completes the TaskManager issue.<\/p>\n\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">frontend-repo PR: Related to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\nbackend-repo PR: Related to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\nmobile-repo PR: Closes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Why? Because if you use <code>Closes<\/code> in the first PR, GitHub may close the central TaskManager issue too early after that PR is merged.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Branch Naming Standard<\/h1>\n\n\n\n<p>Branch names are for humans and team discipline. GitHub does not automatically close issues just because of a branch name, but a good branch name makes everything easier.<\/p>\n\n\n\n<p>Recommended format:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">task-560-short-description\n<\/code><\/span><\/pre>\n\n\n<p>Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b task-560-add-login-validation\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b task-560-fix-vehicle-filter\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b task-560-update-dashboard-ui\n<\/code><\/span><\/pre>\n\n\n<p>For larger teams, use repo prefix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b tm-560-backend-login-validation\n<\/code><\/span><\/pre>\n\n\n<p>or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b taskmanager-560-api-filter-fix\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. PR Title Standard<\/h1>\n\n\n\n<p>Recommended PR title:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">login<\/span> <span class=\"hljs-selector-tag\">validation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">vehicle<\/span> <span class=\"hljs-selector-tag\">search<\/span> <span class=\"hljs-selector-tag\">filters<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Fix<\/span> <span class=\"hljs-selector-tag\">dashboard<\/span> <span class=\"hljs-selector-tag\">loading<\/span> <span class=\"hljs-selector-tag\">issue<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">backend<\/span> <span class=\"hljs-selector-tag\">API<\/span> <span class=\"hljs-selector-tag\">for<\/span> <span class=\"hljs-selector-tag\">task<\/span> <span class=\"hljs-selector-tag\">assignment<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Update<\/span> <span class=\"hljs-selector-tag\">mobile<\/span> <span class=\"hljs-selector-tag\">task<\/span> <span class=\"hljs-selector-tag\">detail<\/span> <span class=\"hljs-selector-tag\">screen<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The PR title is not enough for GitHub linking. The real link should be in the PR body:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Related to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Manual Linking Using GitHub Development Sidebar<\/h1>\n\n\n\n<p>GitHub also allows manual linking.<\/p>\n\n\n\n<p>For your case:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the TaskManager issue.<\/li>\n\n\n\n<li>Go to:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Find the <strong>Development<\/strong> section in the right sidebar.<\/li>\n\n\n\n<li>Click link\/add item.<\/li>\n\n\n\n<li>Select the code repository.<\/li>\n\n\n\n<li>Select the PR or branch.<\/li>\n\n\n\n<li>Click <strong>Apply<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p>GitHub\u2019s docs say that from the issue sidebar, you can manually link a PR or branch, and the issue can be in a different repository than the linked PR or branch. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<p>Important limitation: from the PR sidebar, manual linking is limited to issues in the same repository. From the issue sidebar, cross-repo linking is supported. GitHub\u2019s docs state that PR-sidebar manual linking requires the issue and PR to be in the same repository, while issue-sidebar linking supports a different repository. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Why You Cannot See All Commit Messages in the TaskManager Issue Timeline<\/h1>\n\n\n\n<p>This was your exact problem.<\/p>\n\n\n\n<p>You linked the PR\/branch from:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">TaskManager<\/span> <span class=\"hljs-selector-tag\">issue<\/span> <span class=\"hljs-selector-id\">#560<\/span> \u2192 <span class=\"hljs-selector-tag\">Development<\/span> <span class=\"hljs-selector-tag\">sidebar<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>But you still could not see all commit messages inside the issue timeline.<\/p>\n\n\n\n<p>That is normal.<\/p>\n\n\n\n<p>Manual Development linking shows that work is connected to the issue. It does not automatically copy every commit message from the PR into the issue timeline. GitHub is more PR-centric than commit-list-centric.<\/p>\n\n\n\n<p>Also, GitHub says that if closing keywords are used in a commit message, the issue can be closed when that commit is merged into the default branch, but the PR containing that commit will not be listed as a linked PR. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<p>So, the best native GitHub flow is:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">TaskManager issue\n    \u2193\nLinked PR visible in Development\n    \u2193\nOpen PR\n    \u2193\nGo to Commits tab\n    \u2193\nSee commit messages\n<\/code><\/span><\/pre>\n\n\n<p>If you want commit messages directly inside the TaskManager issue, you need automation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Recommended Workflow for Your Team<\/h1>\n\n\n\n<p>For each TaskManager issue:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create branch in code repo<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b task-560-add-login-validation\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 2: Add commits with issue reference<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add login validation for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add login validation tests for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Fix validation error message for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 3: Create PR with proper title<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">login<\/span> <span class=\"hljs-selector-tag\">validation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4: Add PR body<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added login validation\n- Added validation test cases\n- Updated error response\n\n<span class=\"hljs-comment\">## Testing done<\/span>\n\n- Ran unit tests\n- Tested login flow locally\n\n<span class=\"hljs-comment\">## Notes<\/span>\n\nThis PR is part of TaskManager issue <span class=\"hljs-comment\">#560.<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 5: Link PR manually from TaskManager issue<\/h2>\n\n\n\n<p>Go to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">TaskManager<\/span> <span class=\"hljs-selector-tag\">issue<\/span> <span class=\"hljs-selector-id\">#560<\/span> \u2192 <span class=\"hljs-selector-tag\">Development<\/span> \u2192 <span class=\"hljs-selector-tag\">select<\/span> <span class=\"hljs-selector-tag\">repo<\/span> \u2192 <span class=\"hljs-selector-tag\">select<\/span> <span class=\"hljs-selector-tag\">PR<\/span> \u2192 <span class=\"hljs-selector-tag\">Apply<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 6: Use closing keyword only in final PR<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Closes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Same Issue, Multiple Repositories Example<\/h1>\n\n\n\n<p>Assume issue:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You need changes in 3 repos:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">frontend-web\nbackend-api\nmobile-app\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Backend PR<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added API endpoint\n- Added request validation\n- Added DB migration\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Frontend PR<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added task form UI\n- Integrated backend API\n- Added error handling\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Mobile PR<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nCloses devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added mobile task screen\n- Integrated API\n- Completed <span class=\"hljs-keyword\">final<\/span> user flow\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This gives you clean tracking without closing the issue too early.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Multiple Issues in One PR<\/h1>\n\n\n\n<p>Sometimes one PR completes multiple issues.<\/p>\n\n\n\n<p>Same repo example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Resolves<\/span> <span class=\"hljs-selector-id\">#10<\/span>, <span class=\"hljs-selector-tag\">resolves<\/span> <span class=\"hljs-selector-id\">#11<\/span>, <span class=\"hljs-selector-tag\">resolves<\/span> <span class=\"hljs-selector-id\">#12<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Cross-repo example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Resolves devops-school-com\/TaskManager<span class=\"hljs-comment\">#560, resolves devops-school-com\/TaskManager#561<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Mixed example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Resolves <span class=\"hljs-comment\">#10, resolves devops-school-com\/TaskManager#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub documents that multiple issues should use full syntax for each issue reference. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. One Issue, Multiple PRs<\/h1>\n\n\n\n<p>This is your most common case.<\/p>\n\n\n\n<p>Use <code>Related to<\/code> everywhere:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Related to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Use <code>Closes<\/code> only once, in the final PR:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Closes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Recommended pattern:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Repo<\/th><th>PR Body<\/th><\/tr><\/thead><tbody><tr><td>backend-api<\/td><td><code>Related to devops-school-com\/TaskManager#560<\/code><\/td><\/tr><tr><td>frontend-web<\/td><td><code>Related to devops-school-com\/TaskManager#560<\/code><\/td><\/tr><tr><td>mobile-app<\/td><td><code>Related to devops-school-com\/TaskManager#560<\/code><\/td><\/tr><tr><td>final integration PR<\/td><td><code>Closes devops-school-com\/TaskManager#560<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Commit Message Best Practices<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">16.1 Good Commit Message<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add task assignment API for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">16.2 Better Commit Message<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git commit -m <span class=\"hljs-string\">\"Add task assignment API\n\nRelated to devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">16.3 Best Multi-Line Commit Message<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git commit -m <span class=\"hljs-string\">\"Add task assignment API\n\n- Added task assignment endpoint\n- Added request validation\n- Added service layer method\n- Added unit tests\n\nRelated to devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">16.4 Commit Message for Bug Fix<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git commit -m <span class=\"hljs-string\">\"Fix task status filter bug\n\nThe completed task filter was not applying organization scope.\n\nRelated to devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">16.5 Commit Message for Final Fix<\/h2>\n\n\n\n<p>Use carefully:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git commit -m <span class=\"hljs-string\">\"Fix task assignment workflow\n\nCloses devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub allows closing keywords in commit messages, but the cleaner workflow is usually to put the closing keyword in the PR body, because PRs are easier to review and audit. GitHub also notes that when a commit message closes an issue, the PR containing that commit will not be listed as the linked PR. (<a href=\"https:\/\/docs.github.com\/en\/issues\/tracking-your-work-with-issues\/using-issues\/linking-a-pull-request-to-an-issue\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. PR Template for Same-Repo and Cross-Repo Work<\/h1>\n\n\n\n<p>Add this file in each code repo:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.github\/pull_request_template.md\n<\/code><\/span><\/pre>\n\n\n<p>Template:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">## Task Link\n\n<span class=\"hljs-comment\">&lt;!-- Same repo example: Related to #123 --&gt;<\/span>\n<span class=\"hljs-comment\">&lt;!-- Cross repo example: Related to devops-school-com\/TaskManager#560 --&gt;<\/span>\n\nRelated to devops-school-com\/TaskManager#ISSUE_ID\n\n## What changed?\n\n- \n\n## Testing done\n\n- \n\n## Screenshots \/ Logs\n\n- \n\n## Deployment notes\n\n- \n\n## Final PR?\n\n- &#91; ] This PR is the final PR for the task\n- &#91; ] If final, replace `Related to` with `Closes`\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For your specific task:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task Link<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- \n\n<span class=\"hljs-comment\">## Testing done<\/span>\n\n- \n\n<span class=\"hljs-comment\">## Screenshots \/ Logs<\/span>\n\n- \n\n<span class=\"hljs-comment\">## Deployment notes<\/span>\n\n- \n\n<span class=\"hljs-comment\">## Final PR?<\/span>\n\n- &#91; ] This PR is the <span class=\"hljs-keyword\">final<\/span> PR <span class=\"hljs-keyword\">for<\/span> TaskManager issue <span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Issue Template for TaskManager Repo<\/h1>\n\n\n\n<p>In the central <code>TaskManager<\/code> repo, create:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.github\/ISSUE_TEMPLATE\/task.yml\n<\/code><\/span><\/pre>\n\n\n<p>Or use a simple Markdown issue template:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task Summary<\/span>\n\nDescribe the task.\n\n<span class=\"hljs-comment\">## Repositories Involved<\/span>\n\n- &#91; ] frontend-web\n- &#91; ] backend-api\n- &#91; ] mobile-app\n- &#91; ] other\n\n<span class=\"hljs-comment\">## Expected PRs<\/span>\n\n- frontend-web:\n- backend-api:\n- mobile-app:\n\n<span class=\"hljs-comment\">## Acceptance Criteria<\/span>\n\n- &#91; ] \n- &#91; ] \n- &#91; ] \n\n<span class=\"hljs-comment\">## Linked PRs<\/span>\n\n- \n\n<span class=\"hljs-comment\">## Final Closure Rule<\/span>\n\nOnly the <span class=\"hljs-keyword\">final<\/span> PR should <span class=\"hljs-keyword\">use<\/span>:\n\n<span class=\"hljs-title\">Closes<\/span> <span class=\"hljs-title\">devops<\/span>-<span class=\"hljs-title\">school<\/span>-<span class=\"hljs-title\">com<\/span>\/<span class=\"hljs-title\">TaskManager<\/span>#<span class=\"hljs-title\">ISSUE_ID<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For issue <code>#560<\/code>, the issue body can maintain a manual list:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Linked PRs<\/span>\n\n- backend-api: devops-school-com\/backend-api<span class=\"hljs-comment\">#45<\/span>\n- frontend-web: devops-school-com\/frontend-web<span class=\"hljs-comment\">#88<\/span>\n- mobile-app: devops-school-com\/mobile-app<span class=\"hljs-comment\">#19<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This is very useful because GitHub\u2019s native UI may not give you a perfect central commit list.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. How to See Work from the TaskManager Issue<\/h1>\n\n\n\n<p>Inside <code>TaskManager#560<\/code>, you may see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Development<\/span>\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">backend-api<\/span><span class=\"hljs-selector-id\">#45<\/span>\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">frontend-web<\/span><span class=\"hljs-selector-id\">#88<\/span>\n<span class=\"hljs-selector-tag\">-<\/span> <span class=\"hljs-selector-tag\">mobile-app<\/span><span class=\"hljs-selector-id\">#19<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To view commits:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Click the linked PR.<\/li>\n\n\n\n<li>Open the <strong>Commits<\/strong> tab.<\/li>\n\n\n\n<li>Review all commit messages.<\/li>\n\n\n\n<li>Open <strong>Files changed<\/strong> for code review.<\/li>\n\n\n\n<li>Return to TaskManager issue for final status.<\/li>\n<\/ol>\n\n\n\n<p>This is the most natural GitHub-native workflow.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. If You Want Commit Messages Directly Inside the TaskManager Issue<\/h1>\n\n\n\n<p>GitHub does not provide a perfect native \u201cshow all commits from linked PRs inside central issue timeline\u201d view.<\/p>\n\n\n\n<p>So use GitHub Actions.<\/p>\n\n\n\n<p>The idea:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Developer creates PR in backend-api\n        \u2193\nGitHub Action extracts TaskManager issue ID from PR body\n        \u2193\nAction collects PR commits\n        \u2193\nAction comments on devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-69\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>GitHub CLI supports adding comments to issues with <code>gh issue comment<\/code>, including selecting another repository with <code>--repo OWNER\/REPO<\/code>. (<a href=\"https:\/\/cli.github.com\/manual\/gh_issue_comment\">GitHub CLI<\/a>)<\/p>\n\n\n\n<p>GitHub REST API can also create and manage comments on issues and pull requests. (<a href=\"https:\/\/docs.github.com\/rest\/issues\/comments\">GitHub Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. GitHub Action Example: Comment Commit Summary on TaskManager Issue<\/h1>\n\n\n\n<p>Add this workflow in each code repo:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.github\/workflows\/comment-taskmanager-issue.yml\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">name: Comment TaskManager Issue with PR Commit Summary\n\non:\n  pull_request:\n    types: &#91;opened, synchronize, reopened, closed]\n\njobs:\n  comment-taskmanager:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Extract TaskManager issue ID from PR body\n        id: extract\n        shell: bash\n        run: |\n          PR_BODY=<span class=\"hljs-string\">\"${{ github.event.pull_request.body }}\"<\/span>\n          ISSUE_ID=$(<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$PR_BODY\"<\/span> | grep -oE <span class=\"hljs-string\">'devops-school-com\/TaskManager#&#91;0-9]+'<\/span> | head <span class=\"hljs-number\">-1<\/span> | grep -oE <span class=\"hljs-string\">'&#91;0-9]+'<\/span>)\n\n          <span class=\"hljs-keyword\">if<\/span> &#91; -z <span class=\"hljs-string\">\"$ISSUE_ID\"<\/span> ]; then\n            <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"No TaskManager issue found in PR body.\"<\/span>\n            <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"found=false\"<\/span> &gt;&gt; <span class=\"hljs-string\">\"$GITHUB_OUTPUT\"<\/span>\n            <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">0<\/span>\n          fi\n\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"found=true\"<\/span> &gt;&gt; <span class=\"hljs-string\">\"$GITHUB_OUTPUT\"<\/span>\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"issue_id=$ISSUE_ID\"<\/span> &gt;&gt; <span class=\"hljs-string\">\"$GITHUB_OUTPUT\"<\/span>\n\n      - name: Checkout code\n        <span class=\"hljs-keyword\">if<\/span>: steps.extract.outputs.found == <span class=\"hljs-string\">'true'<\/span>\n        uses: actions\/checkout@v4\n        with:\n          fetch-depth: <span class=\"hljs-number\">0<\/span>\n\n      - name: Build commit summary\n        <span class=\"hljs-keyword\">if<\/span>: steps.extract.outputs.found == <span class=\"hljs-string\">'true'<\/span>\n        id: commits\n        shell: bash\n        run: |\n          PR_NUMBER=<span class=\"hljs-string\">\"${{ github.event.pull_request.number }}\"<\/span>\n          PR_TITLE=<span class=\"hljs-string\">\"${{ github.event.pull_request.title }}\"<\/span>\n          PR_URL=<span class=\"hljs-string\">\"${{ github.event.pull_request.html_url }}\"<\/span>\n          REPO=<span class=\"hljs-string\">\"${{ github.repository }}\"<\/span>\n          ISSUE_ID=<span class=\"hljs-string\">\"${{ steps.extract.outputs.issue_id }}\"<\/span>\n\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"## Code update from ${REPO}#${PR_NUMBER}\"<\/span> &gt; comment.md\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"\"<\/span> &gt;&gt; comment.md\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"**PR:** ${PR_TITLE}\"<\/span> &gt;&gt; comment.md\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"**PR URL:** ${PR_URL}\"<\/span> &gt;&gt; comment.md\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"**Status:** ${{ github.event.action }}\"<\/span> &gt;&gt; comment.md\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"\"<\/span> &gt;&gt; comment.md\n          <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"### Commits\"<\/span> &gt;&gt; comment.md\n\n          gh pr view <span class=\"hljs-string\">\"$PR_NUMBER\"<\/span> \\\n            --repo <span class=\"hljs-string\">\"$REPO\"<\/span> \\\n            --json commits \\\n            --jq <span class=\"hljs-string\">'.commits&#91;] | \"- `\" + .oid&#91;0:7] + \"` \" + .messageHeadline'<\/span> &gt;&gt; comment.md\n\n      - name: Comment on TaskManager issue\n        <span class=\"hljs-keyword\">if<\/span>: steps.extract.outputs.found == <span class=\"hljs-string\">'true'<\/span>\n        run: |\n          gh issue comment <span class=\"hljs-string\">\"${{ steps.extract.outputs.issue_id }}\"<\/span> \\\n            --repo devops-school-com\/TaskManager \\\n            --body-file comment.md\n        env:\n          GH_TOKEN: ${{ secrets.TASKMANAGER_TOKEN }}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Important: for cross-repo commenting, use a token that has permission to write comments in <code>devops-school-com\/TaskManager<\/code>. GitHub recommends using minimum required permissions for <code>GITHUB_TOKEN<\/code>, and when a workflow needs permissions not available through <code>GITHUB_TOKEN<\/code>, you can use a GitHub App token or a personal access token stored as a repository secret. (<a href=\"https:\/\/docs.github.com\/actions\/reference\/authentication-in-a-workflow\">GitHub Docs<\/a>)<\/p>\n\n\n\n<p>Create a secret in each code repo:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">TASKMANAGER_TOKEN\n<\/code><\/span><\/pre>\n\n\n<p>That token should have permission to comment on issues in:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">devops-school-com\/TaskManager\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Recommended Final Team Standard<\/h1>\n\n\n\n<p>Use this as your official rule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">task-560-short-description\n<\/code><\/span><\/pre>\n\n\n<p>Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">task-560-add-login-validation\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Commit Message<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"Add login validation for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">PR Title<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">login<\/span> <span class=\"hljs-selector-tag\">validation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">PR Body<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- \n\n<span class=\"hljs-comment\">## Testing done<\/span>\n\n- \n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Final PR Body<\/h2>\n\n\n\n<p>Only when the task is fully completed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Closes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Manual Linking<\/h2>\n\n\n\n<p>From the central issue:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">TaskManager issue <span class=\"hljs-comment\">#560 \u2192 Development \u2192 Link PR\/branch<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Optional Automation<\/h2>\n\n\n\n<p>Use GitHub Actions to comment PR commit summaries into the TaskManager issue.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Common Mistakes and Fixes<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Mistake<\/th><th>Problem<\/th><th>Correct approach<\/th><\/tr><\/thead><tbody><tr><td>Using <code>#560<\/code> in another repo<\/td><td>Links to issue\/PR <code>#560<\/code> in the current repo, not TaskManager<\/td><td>Use <code>devops-school-com\/TaskManager#560<\/code><\/td><\/tr><tr><td>Using <code>Closes<\/code> in every PR<\/td><td>First merged PR may close the central issue too early<\/td><td>Use <code>Related to<\/code> until final PR<\/td><\/tr><tr><td>Expecting commit messages inside TaskManager issue timeline<\/td><td>GitHub does not show all linked PR commits directly in central issue timeline<\/td><td>Open linked PR \u2192 Commits tab, or use GitHub Action<\/td><\/tr><tr><td>Adding issue ID only in branch name<\/td><td>Branch name alone is not enough for strong tracking<\/td><td>Add issue reference in PR body and commits<\/td><\/tr><tr><td>Linking PR from PR sidebar for cross-repo issue<\/td><td>PR sidebar manual linking works for same repo only<\/td><td>Use TaskManager issue sidebar \u2192 Development<\/td><\/tr><tr><td>Using closing keyword on non-default target branch<\/td><td>GitHub may ignore the closing keyword<\/td><td>Target default branch for auto-close<\/td><\/tr><tr><td>Putting issue ID only in PR title<\/td><td>Title is useful but not enough<\/td><td>Put full reference in PR body<\/td><\/tr><tr><td>Using commit closing keyword only<\/td><td>Issue may close, but PR may not appear as linked PR<\/td><td>Prefer closing keyword in PR body<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Complete End-to-End Example for Your Case<\/h1>\n\n\n\n<p>Issue:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Code repo:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">devops-school-com\/backend-api\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout -b task-560-add-login-validation\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Make commits<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git add .\ngit commit -m <span class=\"hljs-string\">\"Add login validation for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git add .\ngit commit -m <span class=\"hljs-string\">\"Add login validation tests for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git add .\ngit commit -m <span class=\"hljs-string\">\"Fix validation response format for devops-school-com\/TaskManager#560\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Push branch<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git push origin task-560-add-login-validation\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Create PR<\/h2>\n\n\n\n<p>PR title:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-80\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;Task #560]<\/span> <span class=\"hljs-selector-tag\">Add<\/span> <span class=\"hljs-selector-tag\">login<\/span> <span class=\"hljs-selector-tag\">validation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-80\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>PR body:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-81\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Task<\/span>\n\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n\n<span class=\"hljs-comment\">## What changed?<\/span>\n\n- Added login validation\n- Added validation test cases\n- Fixed response format\n\n<span class=\"hljs-comment\">## Testing done<\/span>\n\n- Ran unit tests\n- Tested login API locally\n\n<span class=\"hljs-comment\">## Notes<\/span>\n\nThis is part of the central TaskManager issue.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-81\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">If this is final PR<\/h2>\n\n\n\n<p>Change:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-82\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Related to devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-82\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>to:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-83\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Closes devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-83\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Manual link<\/h2>\n\n\n\n<p>Open:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-84\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-84\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Development \u2192 Link PR\/branch \u2192 select backend-api PR \u2192 Apply\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">View commits<\/h2>\n\n\n\n<p>Inside the TaskManager issue, click the linked PR. Then open the PR\u2019s <strong>Commits<\/strong> tab.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Final Recommendation<\/h1>\n\n\n\n<p>For your setup, the best practical standard is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-85\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Central issues:\ndevops-school-com\/TaskManager\n\nCode changes:\nOther repos\n\nEvery branch:\ntask-ISSUE_ID-short-description\n\nEvery commit:\nMessage + devops-school-com\/TaskManager<span class=\"hljs-comment\">#ISSUE_ID<\/span>\n\nEvery PR:\n&#91;Task <span class=\"hljs-comment\">#ISSUE_ID] Title<\/span>\n\nEvery PR body:\nRelated to devops-school-com\/TaskManager<span class=\"hljs-comment\">#ISSUE_ID<\/span>\n\nOnly <span class=\"hljs-keyword\">final<\/span> PR:\nCloses devops-school-com\/TaskManager<span class=\"hljs-comment\">#ISSUE_ID<\/span>\n\n<span class=\"hljs-keyword\">For<\/span> visible commit summaries inside TaskManager:\n<span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">GitHub<\/span> <span class=\"hljs-title\">Actions<\/span> <span class=\"hljs-title\">automation<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-85\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This gives you the cleanest traceability:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-86\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">TaskManager issue\n    \u2192 linked PRs\n    \u2192 PR commits\n    \u2192 code changes\n    \u2192 <span class=\"hljs-keyword\">final<\/span> closure\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-86\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>For your specific issue, always use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-87\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">devops-school-com\/TaskManager<span class=\"hljs-comment\">#560<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-87\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>","protected":false},"excerpt":{"rendered":"<p>1. Introduction In many teams, GitHub Issues, commits, branches, and pull requests are created in the same repository. That is the simple case. But your setup is&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-75882","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/75882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=75882"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/75882\/revisions"}],"predecessor-version":[{"id":75883,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/75882\/revisions\/75883"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=75882"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=75882"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=75882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}