\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{Marco Ponton (mponton)} \pdfinfo{ /Title (qk-conventional-commits.pdf) /Creator (Cheatography) /Author (Marco Ponton (mponton)) /Subject (QK Conventional Commits Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{251565} \definecolor{LightBackground}{HTML}{F8F7FA} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{QK Conventional Commits Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{Marco Ponton (mponton)} via \textcolor{DarkBackground}{\uline{cheatography.com/173169/cs/36383/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}Marco Ponton (mponton) \\ \uline{cheatography.com/mponton} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 11th January, 2023.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{3} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{General Format}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{`\textless{}type\textgreater{}{[}optional scope{]}{[}!{]}: \textless{}description\textgreater{}` \newline % Row Count 1 (+ 1) `\textless{}BLANK LINE\textgreater{}` \newline % Row Count 2 (+ 1) `{[}optional body{]}` \newline % Row Count 3 (+ 1) `\textless{}BLANK LINE\textgreater{}` \newline % Row Count 4 (+ 1) `{[}optional footer(s){]}`% Row Count 5 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{type}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{See `Types` on the right.% Row Count 1 (+ 1) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{scope}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{The `scope` is OPTIONAL but if present is must immediately follow the `type` and be in parenthesis (e.g. `(auth)`). The scope further qualifies the change. For example, "`fix: enforce pw min length check`" could become "`fix(auth): enforce pw min length check`" to point out the fix was done in the `auth` section of the codebase.% Row Count 7 (+ 7) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{exclamation (!)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{An exclamation `!` mark can be used before the colon to indicate a breaking change without having to provide a footer. This correlates with \{\{link="https://semver.org/\#summary"\}\}MAJOR\{\{/link\}\} in Semantic Versioning. Example: `fix!: remove insecure login option`.% Row Count 6 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{description}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{Subject/summary of the change. See also `Good Commit Message` on the right.% Row Count 2 (+ 2) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{body}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{An optional more complete description of the changes. Usually you should use this further describe the reasons and implications of a change.% Row Count 3 (+ 3) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{footer(s)}} \tn \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{You can add optional footers. In the context of BitBucket and CHANGELOGS, the only useful footer is `BREAKING CHANGE`. It {\emph{MUST}} be present if you introduce a breaking change and should include a description of what will break. Example: `BREAKING CHANGE: -{}-insecure flag will now produce an error`% Row Count 6 (+ 6) } \tn \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{x{0.84609 cm} x{4.13091 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{5.377cm}}{\bf\textcolor{white}{Types}} \tn % Row 0 \SetRowColor{LightBackground} build & Commit that affects the build system or external dependencies \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} chore & Other commit that do not modify source or test files \tn % Row Count 4 (+ 2) % Row 2 \SetRowColor{LightBackground} ci & Commit that affect the CI configuration files and scripts \tn % Row Count 6 (+ 2) % Row 3 \SetRowColor{white} dev & {\bf{QK}}: Commit worth mentioning during active development (included in changelogs) \tn % Row Count 9 (+ 3) % Row 4 \SetRowColor{LightBackground} docs & Commit that affects the documentation \tn % Row Count 11 (+ 2) % Row 5 \SetRowColor{white} feat & Commit that introduces a new feature to the codebase (this correlates with \{\{link="https://semver.org/\#summary"\}\}MINOR\{\{/link\}\} in Semantic Versioning). \tn % Row Count 16 (+ 5) % Row 6 \SetRowColor{LightBackground} fix & Commit that patches a bug in your codebase (this correlates with \{\{link="https://semver.org/\#summary"\}\}PATCH\{\{/link\}\} in Semantic Versioning). \tn % Row Count 21 (+ 5) % Row 7 \SetRowColor{white} perf & Commit that improves performance \tn % Row Count 23 (+ 2) % Row 8 \SetRowColor{LightBackground} \seqsplit{refactor} & Commit that neither fixes a bug nor adds a feature \tn % Row Count 25 (+ 2) % Row 9 \SetRowColor{white} \seqsplit{revert} & Commit that reverts a previous commit \tn % Row Count 27 (+ 2) % Row 10 \SetRowColor{LightBackground} style & Commit that does not affect the meaning of the code \tn % Row Count 29 (+ 2) % Row 11 \SetRowColor{white} test & Commit that adds or updates tests \tn % Row Count 30 (+ 1) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{5.377cm}{x{0.84609 cm} x{4.13091 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{5.377cm}}{\bf\textcolor{white}{Types (cont)}} \tn % Row 12 \SetRowColor{LightBackground} wip & {\bf{QK}}: Work In Progress (ignored in changelogs) \tn % Row Count 2 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{\{\{fa-gift\}\} Tips}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Follow structure, spacing and use exact types. `fix:foobar` \{\{fa-warning\}\} != `fix: foobar` \{\{fa-check\}\} , `doc` \{\{fa-warning\}\} != `docs` \{\{fa-check\}\}} \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{Don't use a `scope` unless meaningful as it reduce the length of the `description`.} \tn % Row Count 5 (+ 2) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Limit yourself to the valid types documented here. Anything else will be ignored in changelogs.} \tn % Row Count 7 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{\{\{fa-comment-o\}\} Good Commit Message}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Use imperative verb form (e.g. `add foo bar` not `added foo bar`).} \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{Write commit summary in lowercase letters.} \tn % Row Count 3 (+ 1) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Review your message for typos before committing.} \tn % Row Count 4 (+ 1) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{Commit summary (which is the complete `type(scope): description` line) {\emph{should}} be limited to 50 characters, or 72 characters at most} \tn % Row Count 7 (+ 3) % Row 4 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{The `body` can contain as many lines as needed but each should be at most 72 characters.} \tn % Row Count 9 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{5.377cm}{X} \SetRowColor{DarkBackground} \mymulticolumn{1}{x{5.377cm}}{\bf\textcolor{white}{\{\{fa-git\}\} Good Commits}} \tn % Row 0 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Commits with types other than `dev` and `wip` should make up a single unit of work (change). For example, a `fix` commit should fix a single issue, not many.} \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{Commit often. Do not wait to have 20 modified files with different changes left and right. It will be harder to extract proper commits from all the changes and you will end up committing unrelated changes together.} \tn % Row Count 9 (+ 5) % Row 2 \SetRowColor{LightBackground} \mymulticolumn{1}{x{5.377cm}}{Make sure you test your code before committing it, but {\emph{particularly}} before {\emph{pushing}} it. It is easy to amend a commit or rebase locally, harder to keep a clean history after having pushed bad code to BitBucket.} \tn % Row Count 14 (+ 5) % Row 3 \SetRowColor{white} \mymulticolumn{1}{x{5.377cm}}{Keep your history clean. It is OK and desirable to {\emph{push}} code often to prevent data loss, but work on your own branch and rebase before merging to a published branch. Nobody likes to see 13 `wip: something` messages in the commit log.} \tn % Row Count 19 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}-} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}