Git Course 0%

Issues, labels, milestones, boards

Intermediate GitLab UI ≈ 10 min

What you will learn

  • What makes an issue useful rather than a note to nobody
  • Labels, milestones, assignees and how boards use them
  • Quick actions, and how issues connect to branches and merge requests

After this lesson you can

  • I can write an issue a colleague can act on without asking me anything

Why this matters

The issue is where a piece of work begins and where its story is kept. A good one gets picked up and finished; a vague one sits in the backlog being re-read. For a non-developer this is often the main way you contribute, so it is worth doing well.

Writing an issue people can act on

Plan → Issues → New issue. The form is short; what you put in it decides everything.

Part What to write
Title The problem or the outcome, in one line: "Installation guide is missing the Windows steps" — not "docs"
Description What you observed, what you expected, and where. For a bug: exact steps, the exact error text, the version or environment
Assignee Leave empty unless you know who; an unassigned issue is for the team to pick up
Labels Kind and area, so it can be found and filtered
Milestone If it must be in a particular release
Due date Only if a real date exists; a made-up one is noise

Two habits make a large difference. Paste text, not screenshots, for anything that is text: an error message in a code block can be searched and copied, an image cannot. And say where: the file, the page, the URL. "The FAQ is wrong" costs someone ten minutes of hunting.

Labels

Labels are the filing system. Most teams use two or three families:

Family Examples Purpose
Kind bug, feature, documentation, chore What sort of work
Area frontend, api, docs, data Which part of the project
State needs-info, blocked, good first issue Where it is stuck, or an invitation

Labels can be defined on the project or on the group, and group labels are shared by every project inside, which keeps a team's vocabulary consistent. Manage → Labels is where they live. Scoped labels (written priority::high) are mutually exclusive: setting priority::low removes priority::high automatically, which stops an issue carrying two contradictory priorities.

Milestones

A milestone is a named goal with dates, usually a release or a sprint: Plan → Milestones. Its page shows the issues and merge requests assigned to it and a burndown of how many are closed, which is the honest answer to "will this be ready?".

If your change must ship with a particular release, put its issue in that milestone. That is the only way anyone planning the release will see it.

Boards

Plan → Issue boards shows issues as cards in columns. The columns are usually labels, so moving a card applies or removes the label, which is the part that surprises people: the board is a view of the issues, not a separate system.

A typical board: Open, workflow::doing, workflow::review, Closed. Dragging a card from Open to workflow::doing adds that label; dragging to Closed closes the issue. Boards can also be filtered by milestone, assignee or label, and a project can have several boards for different audiences.

Issues and Git

The connection is the issue number, and it works in three places (lesson 1.6):

  • In a branch name: docs/12-windows-install-steps. GitLab links branch to issue when the number is in the name, and the issue's Development section then shows the branch.
  • In a commit message: docs: add Windows steps (#12) becomes a link.
  • In a merge request description: Closes #12 links it and closes the issue automatically when the merge request is merged.

The issue page has a Create merge request button that creates a correctly named branch and a draft merge request in one step, which is the tidiest way to start work.

How to do it

Issues live on the platform, so there is no Git command. What the terminal contributes is the number, in the branch name and the commit message:

Terminal
$ git switch -c docs/12-windows-install-steps
$ git commit -m "docs: add Windows steps to installation guide (#12)"

Both links appear on the issue automatically once you push.

Common mistakes

  • A title that is a category. "Docs" or "Bug" tells nobody anything; write the problem.
  • A screenshot of an error. Paste the text; it can be searched and copied.
  • No location. Name the file, the page or the URL.
  • Assigning to a person who has not agreed. Leave it unassigned, or ask first.
  • Expecting the board to be separate from the issues. Moving a card changes labels on the real issue.
  • Forgetting Closes #12 in the merge request, so the issue stays open after the work ships.

Try it yourself

Goal: write one good issue and start work from it.

  1. On your practice project, create an issue for a real improvement to the playground: a title that names the outcome, a description saying where and what, and a documentation label (create the label if needed).
  2. Add it to a milestone you create called v1.3.0.
  3. On the issue page, use Create merge request → Create branch and note the branch name GitLab suggests.
  4. In your clone: git fetch, then git switch <that branch name>, make the change, commit with (#N) in the message, and push.
  5. Look at the issue again: the branch, the commit and the merge request are all linked from it.

Expected result: the issue's Development section lists the branch and the merge request, and the commit message is a link.

Show solution

The linking is automatic and comes entirely from the issue number appearing in the branch name and the commit message. That is why the naming convention from lesson 6.2 is worth following: it is not tidiness, it is what makes the tools connect the pieces.

Check yourself

1. What happens when you drag a card between columns on a GitLab issue board?
2. Which text in a merge request description closes the issue automatically on merge?
3. You are filing a bug. Which is most useful to the person who will fix it?

Key terms

Issue (ticket) Label Milestone Board Merge request (MR)