From 4e7e5d24db310f5d73a2f19ba7468b22b647228c Mon Sep 17 00:00:00 2001 From: Benjamin Uekermann Date: Wed, 19 Jul 2023 14:22:23 +0200 Subject: [PATCH] Add structure of material and content drafts on Git and RSE --- material/1_mon/rse/rse_basics_slides.md | 78 +++++++++ .../2_tue/git/figs/history_linear/fig.png | Bin 0 -> 15272 bytes .../2_tue/git/figs/history_linear/fig.tex | 22 +++ material/2_tue/git/figs/history_merge/fig.png | Bin 0 -> 34965 bytes material/2_tue/git/figs/history_merge/fig.tex | 34 ++++ .../2_tue/git/figs/history_rebase/fig.png | Bin 0 -> 30841 bytes .../2_tue/git/figs/history_rebase/fig.tex | 30 ++++ material/2_tue/git/git_basics_demo.md | 102 ++++++++++++ material/2_tue/git/intro_slides.md | 113 +++++++++++++ material/2_tue/git/merge_rebase_slides.md | 148 ++++++++++++++++++ material/2_tue/git/standards_slides.md | 72 +++++++++ material/2_tue/git/workflow_slides.md | 120 ++++++++++++++ material/3_wed/.gitkeep | 0 material/4_thu/.gitkeep | 0 material/5_fri/.gitkeep | 0 15 files changed, 719 insertions(+) create mode 100644 material/1_mon/rse/rse_basics_slides.md create mode 100644 material/2_tue/git/figs/history_linear/fig.png create mode 100644 material/2_tue/git/figs/history_linear/fig.tex create mode 100644 material/2_tue/git/figs/history_merge/fig.png create mode 100644 material/2_tue/git/figs/history_merge/fig.tex create mode 100644 material/2_tue/git/figs/history_rebase/fig.png create mode 100644 material/2_tue/git/figs/history_rebase/fig.tex create mode 100644 material/2_tue/git/git_basics_demo.md create mode 100644 material/2_tue/git/intro_slides.md create mode 100644 material/2_tue/git/merge_rebase_slides.md create mode 100644 material/2_tue/git/standards_slides.md create mode 100644 material/2_tue/git/workflow_slides.md create mode 100644 material/3_wed/.gitkeep create mode 100644 material/4_thu/.gitkeep create mode 100644 material/5_fri/.gitkeep diff --git a/material/1_mon/rse/rse_basics_slides.md b/material/1_mon/rse/rse_basics_slides.md new file mode 100644 index 0000000..472648b --- /dev/null +++ b/material/1_mon/rse/rse_basics_slides.md @@ -0,0 +1,78 @@ +--- +type: slide +slideOptions: + transition: slide + width: 1400 + height: 900 + margin: 0.1 +--- + + + +# Introduction to Research Software Engineering + +--- + +## Starting Points + +- [DORA declaration](https://sfdora.org/) in 2012: reshape how research impact should be assessed underlining importance of software + +> For the purposes of research assessment, consider the value and impact of all research outputs (including datasets and software) in addition to research publications ... + +- [UK survey in 2014](https://zenodo.org/record/1183562): 7 out of 10 researchers could not conduct research without software. +- [DFG funding calls on research software sustainability](https://www.dfg.de/en/research_funding/programmes/infrastructure/lis/funding_opportunities/call_proposal_software/) in 2016 & 2019 & 2023 +- [Nationale Forschungsdaten Infrastruktur, NFDI](https://www.nfdi.de/?lang=en) since 2020 +- Lack of careers for software developers in academia +- Lack of reproducibility of research that uses software (*"works for me on my machine"* vs. *"works for everyone everywhere"*) + +--- + +## RSE Movement + +... academic software developers needed a name: +**Research Software Engineers** + +[UK Society of RSE](https://society-rse.org/): + +> A Research Software Engineer (RSE) combines professional software engineering expertise with an intimate understanding of research. + +- *"Movement"* started in the UK, first UK RSE conference in 2016 +- First conferences in Germany and the Netherlands in 2019 +- [de-RSE position paper](https://f1000research.com/articles/9-295/v2) in 2020 +- Second Thursday of October is the [International RSE Day](https://researchsoftware.org/council/intl-rse-day.html) +- [Why be an RSE?](https://researchit.blogs.bristol.ac.uk/2021/10/14/international-rse-day-why-be-an-rse/) Interesting and novel projects, technical freedom, RSEs come from varied backgrounds, development for social good + +--- + +## Do I need this in Industry? + +- Yes. Research also happens in industry. +- All RSE things we learn (Git, packaging, CI/CD, virtualization, documentation, ...) is also highly relevant for non-research software. +- Companies use (more and more) the same workflows and tools. + - It is not just about coding. It is about collaborative work. +- Open-source development excellent door opener for industry. +- Some companies use open-source software and need to make contributions. +- Some companies develop their software as open-source software. diff --git a/material/2_tue/git/figs/history_linear/fig.png b/material/2_tue/git/figs/history_linear/fig.png new file mode 100644 index 0000000000000000000000000000000000000000..898e2eb228498849e5a56c0102f0b08759321af2 GIT binary patch literal 15272 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

*$n5IUkCU-3aTEMjB7svC~)(- znD6=E(IiX-d>f}D&)j5h_eJrmMUa~XKMavp1U%Je!w_$d1e(Yy2|i&x;|YAh_z~6z zYC`+ttj()tukd*&OkO#LmY4f#m}m3p z!Op?V+QRGqPSA}+8AA|&|13C~S@3I`JG)pr*dwV(O0j%+&qaf#kHd#(N0NmoNtTNn G2mOD32tvgG literal 0 HcmV?d00001 diff --git a/material/2_tue/git/figs/history_linear/fig.tex b/material/2_tue/git/figs/history_linear/fig.tex new file mode 100644 index 0000000..ae84504 --- /dev/null +++ b/material/2_tue/git/figs/history_linear/fig.tex @@ -0,0 +1,22 @@ +% build with: pdflatex --shell-escape fig.tex +\documentclass[tikz, convert={density=800}]{standalone} + +\usepackage{tikz} +\definecolor{myBlue}{HTML}{42affa} + +\begin{document} +\begin{tikzpicture}[>=latex, thick, shorten >=2pt, shorten <=2pt, ->, myBlue] + \tikzstyle{C}=[circle,fill=myBlue,text=white,minimum size=30pt,inner sep=2pt, font=\LARGE] + \tikzstyle{B}=[text=myBlue, font=\LARGE] + + \node[C] at (0,1) (A) {\texttt{A}}; + \node[C] at (3,1) (B) {\texttt{B}}; + \node[C] at (6,1) (C) {\texttt{C}}; + + \draw [<-] (A) to (B); + \draw [<-] (B) to (C); + + \node[B] at (-3,1) {\texttt{main}}; + +\end{tikzpicture} +\end{document} diff --git a/material/2_tue/git/figs/history_merge/fig.png b/material/2_tue/git/figs/history_merge/fig.png new file mode 100644 index 0000000000000000000000000000000000000000..d10b48db06ca077a5b426f8833c8e966f46dfc18 GIT binary patch literal 34965 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�|O(Y&qndWRi8(v_6Hi8-+23D<4)YDda73cHqk?;nLBW=-=b}t z$-?6Kul0@(3qJ|xyT#f(K66q9+G(u)k{J5Sy1dsX*7hM|V5{TZkb%jM|0*EtQOhW{RV00TX=k>&vFN$`W%9E53z@}F2S)y)X^W_ ztYwv-bMk49>yPZ>_2<+(7ay#GfDXLexD#W@CL>o~N^=h7I(Q6N2}&3vBQ2*e5lRYw zh{HKM!M)mAJuNQxo_6G|sO1V@5*NQXe_wZp#|yl`s_6Ib&ul3nL2_Bn1sUB<(_?}S zLjsRz0KbMlsni1Ci@(J=3n&y)?FMBrl4tLWtSv|E^OtTJv1*^hV-E7I=Q_m-tMp7k z*QR5{D?-NQt{M8Cz)Ntx9u$3&zqHt_=>S+6*gYDw*vtL?rmVeVQJi{1K`AbIV<4o2 zFHrRnQ9kgN*$-(qr;_J=WrJY29D1ssOiNc6?}`0$JTY?h8U1&Y3+D$Ug_Xw~1{(jC zXwOx-#Z-t2U33l=i(jF+$zJYciwbQW|N(Q_kt1bD_L^<*eh@NbmIfU67g{*w13uPo)J z)#f%3ndXoJ#tEG-#ng$)d(d~7;tHJ6K5#Ovu_`^qZOPpid z336eO%J}2+?K%C}h>>%*(eUoIbQZJmg5e-@$)Ql<-2?w@J_a8H@OETjWY&j4SI}>yCv{~duW?|uf zOY-1kz|te0u8D@XWmXoirSq32DVg} z(kbkEC{N5Y$HlHc0AJU*y!y@3vSg{8l>Rc~KHS*m2NxU-7+*-@mRYT#hFox>L@S#v zB#*=j-3!+(b6Cqd{ZUH*Y=(otzMF12%?0=)-bWW`!N|^N{goSt|Y)Ml>SnH zQlI+1)wmu|Ay%LW-u>sV+>R^4!tn~trq15rIk(xpV`2ea8lrBExzW2zA4nvrz_c0w zks6{~D4%532G3bgGwy5v&UnWU-?FXy>?tiP88`8 z*5^%?6Ch-6p;4ru>=`)O0^U$wLlDIQ>B9nLY8}vyZX`sPoB+E-w*a%dFUSdFr;{|2Hw->qA+rYc zl@lAFt!l>|r(O}^$LDI3jDr^ltj?9?AVDt*6>$42z56}|-iV7JO>d{{!!-)HPxjyu z5g4bDbun?rgv;}Ksp2?y!~4L}t+lVL17 z&Fy10T@N4AbVYV-))vnIPcI2Z>(0}5Dw}G@cYb*cLa2HE&85FBs$PQ+ujMv^(;2u7 z!@qa@vvrfNp46#$dj=eHkPUw%Q!jTk!I`?hkues_1R7;N=)U9chrhy}-4(E#l=>VV z7gMjYt-Rwe{ON4AFwr@0ppjS$n(|48Xh|-aD@&1Er|yx{7Q(rs+|e(AS^>nu3?|T0 zm>aBh{p2(K0Hi~bS?F_PEp}#mr(82opbCz|mH3;x*HxR>6&f`7i@C`RIz~t}ZrDue-KkTHR~P3D2d9LPaZc9r7s-_+!+@g*J@ZRP5A8;w&TF1gO$z`m?@}NVUZI0dR083FkaI+H6st8^ob0h}(n0HMVQ^Vwdw8 zI#;j{j$Xp#20Fm9L6CqayIaW`t{kwL7zg<#KaI~P%c6$XQfF^h{d>-Ww4@L8Ydp+! zsWICpjb*KSf9oVTMG~k2_9M$CiR0|e^b_?+0f<5WygX%$SG-Ugi7o93p zSLg-_Be~a11sbVze!3pW1X|u#(c{|s13Jg$sHo#;^3c&#(%8Wi{6T~Sgar8n1^9%- zH3hJeA_9_vqPzk^k^%ynwe4sBKMic`Of1dZ{{I_r#ksr#4NgG|PfW}twM-rGmUgy? c`t=)pg8ZWFM;{yq9RwwLinp)l$m6{K4+P=latex, thick, shorten >=2pt, shorten <=2pt, ->, myBlue] + \tikzstyle{C}=[circle,fill=myBlue,text=white,minimum size=30pt,inner sep=2pt, font=\LARGE] + \tikzstyle{M}=[circle,fill=myOrange,text=white,minimum size=30pt,inner sep=2pt, font=\LARGE] + \tikzstyle{B}=[text=myBlue, font=\LARGE] + + \node[C] at (0,3) (A) {\texttt{A}}; + \node[C] at (3,3) (B) {\texttt{B}}; + \node[C] at (6,3) (C) {\texttt{C}}; + + \node[C] at (3,1) (D) {\texttt{D}}; + \node[C] at (6,1) (E) {\texttt{E}}; + + \node[M] at (9,3) (M) {\texttt{M}}; + + \draw [<-] (A) to (B); + \draw [<-] (B) to (C); + \draw [<-] (A) to (D); + \draw [<-] (D) to (E); + \draw [<-, myOrange] (C) to (M); + \draw [<-, myOrange] (E) to (M); + + \node[B] at (-3,3) {\texttt{main}}; + \node[B] at (-3,1) {\texttt{feature}}; + +\end{tikzpicture} +\end{document} diff --git a/material/2_tue/git/figs/history_rebase/fig.png b/material/2_tue/git/figs/history_rebase/fig.png new file mode 100644 index 0000000000000000000000000000000000000000..17dd3a7a296872fc6beceb05c342fb96663298fe GIT binary patch literal 30841 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, thick, shorten >=2pt, shorten <=2pt, ->, myBlue] + \tikzstyle{C}=[circle,fill=myBlue,text=white,minimum size=30pt,inner sep=2pt, font=\LARGE] + \tikzstyle{M}=[circle,fill=myOrange,text=white,minimum size=30pt,inner sep=2pt, font=\LARGE] + \tikzstyle{B}=[text=myBlue, font=\LARGE] + + \node[C] at (0,3) (A) {\texttt{A}}; + \node[C] at (3,3) (B) {\texttt{B}}; + \node[C] at (6,3) (C) {\texttt{C}}; + + \node[C] at (9,1) (D) {\texttt{D'}}; + \node[C] at (12,1) (E) {\texttt{E'}}; + + \draw [<-] (A) to (B); + \draw [<-] (B) to (C); + \draw [<-] (C) to (D); + \draw [<-] (D) to (E); + + \node[B] at (-3,3) {\texttt{main}}; + \node[B] at (-3,1) {\texttt{feature}}; + +\end{tikzpicture} +\end{document} diff --git a/material/2_tue/git/git_basics_demo.md b/material/2_tue/git/git_basics_demo.md new file mode 100644 index 0000000..3cb9196 --- /dev/null +++ b/material/2_tue/git/git_basics_demo.md @@ -0,0 +1,102 @@ +# Git Demo + +## Recap of Git basics + +- Expert level poll on git: ask students to estimate their level. + - Beginner: I have hardly ever used Git + - User: pull, commit, push, status, diff + - Developer: fork, branch, merge, checkout + - Maintainer: rebase, squash, cherry-pick, bisect + - Owner: submodules + +![git overview picture from py-rse](https://merely-useful.tech/py-rse/figures/git-cmdline/git-remote.png) + +- `git --help`, `git commit --help` +- incomplete statement `git comm` + +- There is a difference between Git and hosting services ([*forges*](https://en.wikipedia.org/wiki/Forge_(software))) + - [GitHub](https://github.com/) + - [GitLab](https://about.gitlab.com/), open-source, hosted e.g. at [IPVS](https://gitlab-sim.informatik.uni-stuttgart.de) + - [Bitbucket](https://bitbucket.org/product/) + - [SourceForge](https://sourceforge.net/) + - many more + - often, more than just hosting, also DevOps + +- Give outlook on remainder of Git chapter: *How I work with Git*, quiz, advanced topics (workflows, rebase, standards), *my neat little Git trick* + +## How I work with Git + +Starting remarks: + +- There is not *the one solution* how to do things with Git. I simply show what I typically use. +- Don't use a client if you don't understand the command line `git` + +- (1) Look at GitHub + - [preCICE repository](https://github.com/precice/precice) + - default branch `develop` + - fork -> my fork + +- (2) Working directory: + - ZSH shell shows git branches + - `git remote -v` (I have upstream, myfork, ...) + - mention difference between ssh and https (also see GitHub) + - get newest changes `git pull upstream develop` + - `git log` -> I use special format, see `~/.gitconfig`, + - check log on GitHub; explain short hash + - `git branch` + - `git branch add-demo-feature` + - `git checkout add-demo-feature` + +- (3) First commit + - `git status` -> always tells you what you can do + - `vi src/action/Action.hpp` -> add `#include "MagicHeader.hpp"` + - `git diff`, `git diff src/com/Action.hpp`, `git diff --color-words` + - `git status`, `git add`, `git status` + - `git commit` -> "Include MagicHeader in Action.hpp" + - `git status`, `git log`, `git log -p`, `git show` + +- (4) Change or revert things + - I forgot to add sth: `git reset --soft HEAD~1`, `git status` + - `git diff`, `git diff HEAD` because already staged + - `git log` + - `git commit` + - actually all that is nonsense: `git reset --hard HEAD~1` + - modify again, all nonsense before committing: `git checkout src/action/Action.hpp` + +- (5) Stash + - while working on unfinished feature, I need to change / test this other thing quickly, too lazy for commits / branches + - `git stash` + - `git stash pop` + +- (6) Create PR + - create commit again + - preview what will be in PR: `git diff develop..add-demo-feature` + - `git push -u myfork add-demo-feature` -> copy link + - explain PR template + - explain target branch + - explain "Allow edits by maintainers" + - cancel + - my fork -> branches -> delete + +- (7) Check out someone else's work + - have a look at an existing PR, look at all tabs, show suggestion feature + - but sometimes we want to really build and try sth out ... + - `git remote -v` + - `git remote add alex git@github.com:ajaust/precice.git` if I don't have remote already (or somebody else) + - `git fetch alex` + - `git checkout -t alex/[branch-name]` + - I could now also push to `ajaust`'s remote + +## Further reading + +### Quick things + +- [Video: Git in 15 minutes: basics, branching, no remote](https://www.youtube.com/watch?v=USjZcfj8yxE) +- [The GitHub Blog: Commits are snapshots, not diffs](https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/) +- Chapters [6](https://merely-useful.tech/py-rse/git-cmdline.html) and [7](https://merely-useful.tech/py-rse/git-advanced.html) of Research Software Engineering with Python +- [Podcast All Things Git: History of VC](https://www.allthingsgit.com/episodes/the_history_of_vc_with_eric_sink.html) +- [git purr](https://girliemac.com/blog/2017/12/26/git-purr/) + +### References + +- [Official documentation](http://git-scm.com/doc) diff --git a/material/2_tue/git/intro_slides.md b/material/2_tue/git/intro_slides.md new file mode 100644 index 0000000..16a89e7 --- /dev/null +++ b/material/2_tue/git/intro_slides.md @@ -0,0 +1,113 @@ +--- +type: slide +slideOptions: + transition: slide + width: 1400 + height: 900 + margin: 0.1 +--- + + + +# Introduction to version control + +--- + +## Learning goals of section + +- Refresh and organize students' existing knowledge on Git (learn how to learn more). +- Students can explain difference between merge and rebase and when to use what. +- How to use Git workflows to organize research software development in a team. +- Get to know a few useful GitHub/GitLab standards and a few helpful tools. + +--- + +## Why do we need version control? + +Version control ... + +- tracks changes to files and helps people share those changes with each other. + - Could also be done via email / Google Docs / ..., but not as accurately and efficiently +- was originally developed for software development, but today cornerstone of *reproducible research* + +> "If you can't git diff a file format, it's broken." + +--- + +## How does version control work? + +- *master* (or *main*) copy of code in repository, can't edit directly +- Instead: check out a working copy of code, edit, commit changes back +- Repository records complete revision history + - You can go back in time + - It's clear who did what when + +--- + +## The alternative: A story told in file names + + + +[http://phdcomics.com/comics/archive/phd052810s.gif](http://phdcomics.com/comics/archive/phd052810s.gif) + +--- + +## A very short history of version control I + +The old centralized variants: + +- 1982: RCS (Revision Control System), operates on single files +- 1986 (release in 1990): CVS (Concurrent Versions System), front end of RCS, operates on whole projects +- 1994: VSS (Microsoft Visual SourceSafe) +- 2000: SVN (Apache Subversion), mostly compatible successor of CVS, *still used today* + +--- + +## A very short history of version control II + +Distributed version control: + +- Besides remote master version, also local copy of repository +- More memory required, but much better performance +- For a long time: highly fragmented market + - 2000: BitKeeper (originally proprietary software) + - 2005: Mercurial + - 2005: Git + - A few more + +Learn more: [Podcast All Things Git: History of VC](https://www.allthingsgit.com/episodes/the_history_of_vc_with_eric_sink.html) + +--- + +## The only standard today: Git + +No longer a fragmented market, there is nearly only Git today: + +- [Stackoverflow developer survey 2021](https://insights.stackoverflow.com/survey/2021#technology-most-popular-technologies): + > "Over 90% of respondents use Git, suggesting that it is a fundamental tool to being a developer." +- All software project candidates for *contribution challenge* use Git +- Is this good or bad? + +--- + +## More facts on Git + +Git itself is open-source: GPL license + +- source on [GitHub](https://github.com/git/git), contributions are a bit more complicated than a simple PR +- written mainly in C +- started by Linus Torvalds, core maintainer since later 2005: Junio Hamano diff --git a/material/2_tue/git/merge_rebase_slides.md b/material/2_tue/git/merge_rebase_slides.md new file mode 100644 index 0000000..9b433d1 --- /dev/null +++ b/material/2_tue/git/merge_rebase_slides.md @@ -0,0 +1,148 @@ +--- +type: slide +slideOptions: + transition: slide + width: 1400 + height: 900 + margin: 0.1 +--- + + + +# Merge vs. Rebase + +--- + +## Linear History + + + +- Commits are snapshots + pointer to parent, not diffs + - But for linear history, this makes no difference +- Each normal commit has one parent commit + - `c05f017^` <-- `c05f017` + - `A` = `B^` <-- `B` + - (`^` is the same as `~1`) + - Pointer to parent commit goes into hash +- `git show` gives diff of commit to parent + +--- + +## Merge Commits + +- `git checkout main && git merge feature` + +- A merge commit (normally) has two parent commits `M^1` and `M^2` (don't confuse `^2` with `~2`) + - Can't show unique diff + - First parent relative to the branch you are on (`M^1` = `C`, `M^2` = `E`) +- `git show` + - `git show`: *"combined diff"* + - GitHub: `git show --first-parent` + - `git show -m`: separate diff to all parents + +--- + +## Why is a Linear History Important? + +We use here: + +> Linear history := no merge commits + +- Merge commits are hard to understand per se. +- A merge takes all commits from `feature` to `main` (on `git log`). --> Hard to understand +- Developers often follow projects by reading commits (reading the diffs). --> Harder to read (where happened what) +- Tracing bugs easier with linear history (see `git bisect`) + - Example: We know a bug was introduced between `v1.3` and `v1.4`. + +--- + +## How to get a Linear History? + +- Real conflicts are very rare in real projects, most merge commits are false positives (not conflicts) and should be avoided. +- If there are no changes on `main`, `git merge` does a *"fast-forward"* merge (no merge commit). +- If there are changes on `main`, rebase `feature` branch. + +--- + +## Rebase + +- `git checkout feature && git rebase main` + +- States of issues change (and new parents) --> history is rewritten +- If `feature` is already on remote, it needs a force push `git push --force myfork feature` (or `--force-with-lease`). +- Be careful: Only use rebase if **only you** work on a branch (a local branch or a branch on your fork). +- For local branches very helpful: `git pull --rebase` (fetch & rebase) + +--- + +## GitHub PR Merge Variants + +- GitHub offers three ways to merge a non-conflicting (no changes in same files) PR: + - Create a merge commit + - Squash and merge + - Rebase and merge +- Look at a PR together, e.g. [PR 1432 from preCICE](https://github.com/precice/precice/pull/1432) (will be closed eventually) + +> What do the options do? + +--- + +## Squash and Merge + +- ... squashes all commits into one + - Often, single commits of feature branch are important while developing the feature, + - ... but not when the feature is merged + - Works well for small feature PRs +- ... also does a rebase (interactively, `git rebase -i`) + +--- + +## Conflicts + +> But what if there is a conflict? + +- Resolve by rebasing `feature` branch (recommended) +- Or resolve by merging `main` into `feature` + +--- + +## Summary and Final Remarks + +- Try to keep a linear history with rebasing whenever reasonable +- Don't use rebase on a public/shared branch during development +- Squash before merging if reasonable +- Delete `feature` branch after merging +- Local view: `git log --graph` +- Remote view on GitHub, e.g. [for preCICE](https://github.com/precice/precice/network) + +--- + +## Further Reading + +- [Bitbucket docs: "Merging vs. Rebasing"](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) +- [Hackernoon: "What's the diff?"](https://hackernoon.com/git-merge-vs-rebase-whats-the-diff-76413c117333) +- [GitHub Blog: "Commits are snapshots, not diffs"](https://github.blog/2020-12-17-commits-are-snapshots-not-diffs/) +- [Stack Overflow: "Git show of a merge commit"](https://stackoverflow.com/questions/40986518/git-show-of-a-merge-commit?) diff --git a/material/2_tue/git/standards_slides.md b/material/2_tue/git/standards_slides.md new file mode 100644 index 0000000..2e776c3 --- /dev/null +++ b/material/2_tue/git/standards_slides.md @@ -0,0 +1,72 @@ +--- +type: slide +slideOptions: + transition: slide + width: 1400 + height: 900 + margin: 0.1 +--- + + + +# GitHub / GitLab Standards + +--- + +## What do we mean with Standards? + +- GitHub uses standards or conventions. +- Certain files or names trigger certain behavior automatically. +- Many are supported by most forges. + - **This is good.** + - Everybody should know them. + +--- + +## Special Files + +Certain files lead to special formatting (normally directly at root of repo): + +- `README.md` + - ... contains meta information / overview / first steps of software. + - ... gets rendered on landing page (and in every folder). +- `LICENSE` + - ... contains software license. + - ... gets rendered on right sidebar, when clicking on license, and on repo preview. +- `CONTRIBUTING.md` + - ... contains guidelines for contributing. + - First-time contributors see banner. +- `CODE_OF_CONDUCT.md` + - ... contains code of conduct. + - ... gets rendered on right sidebar. + +--- + +## Issues and PRs + +- Templates for description in `.github` folder +- `closes #34` (or several other keywords: `fixes`, `resolves`) in commit message or PR description will close issue 34 when merged. +- `help wanted` label gets rendered on repo preview (e.g. *"3 issues need help"*). diff --git a/material/2_tue/git/workflow_slides.md b/material/2_tue/git/workflow_slides.md new file mode 100644 index 0000000..c5fa926 --- /dev/null +++ b/material/2_tue/git/workflow_slides.md @@ -0,0 +1,120 @@ +--- +type: slide +slideOptions: + transition: slide + width: 1400 + height: 900 + margin: 0.1 +--- + + + +# Working in Teams / Git Workflows + +--- + +## Why Workflows? + +- Git offers a lot of flexibility in managing changes. +- When working in a team, some agreements need to be made however (especially on how to work with branches). + +--- + +## Which Workflow? + +- There are standard solutions. +- It depends on the size of the team. +- Workflow should enhance effectiveness of team, not be a burden that limits productivity. + +--- + +## Centralized Workflow + +- Only one branch: the `main` branch +- Keep your changes in local commits till some feature is ready +- If ready, directly push to `main`; no PRs, no reviews +- Conflicts: fix locally (push not allowed anyway), use `git pull --rebase` +- **Good for**: small teams, small projects, projects that are anyway reviewed over and over again +- Example: LaTeX papers + - Put each section in separate file + - Put each sentence in separate line + +--- + +## Feature Branch Workflow + +- Each feature (or bugfix) in separate branch +- Push feature branch to remote, use descriptive name + - e.g. issue number in name if each branch closes one issue +- `main` should never contain broken code +- Protect direct push to `main` +- PR (or MR) with review to merge from feature branch to `main` +- Rebase feature branch on `main` if necessary +- Delete remote branch once merged and no longer needed (one click on GitHub after merge) +- **Good for**: small teams, small projects, prototyping, websites (continuous deployment), documentation +- Aka. [trunk-based development](https://www.atlassian.com/continuous-delivery/continuous-integration/trunk-based-development) or [GitHub flow](https://guides.github.com/introduction/flow/) + +--- + +## Gitflow + +- [Visualization by Vincent Driessen](https://nvie.com/img/git-model@2x.png), from [original blog post in 2010](https://nvie.com/posts/a-successful-git-branching-model/) +- `main` and `develop` + - `main` contains releases as tags + - `develop` contains latest features +- Feature branches created of `develop`, PRs back to `develop` +- Protect `main` and (possibly) `develop` from direct pushes +- Dedicated release branches (e.g., `v1.0`) created of `develop` + - Tested, fixed, merged to `main` + - Afterwards, tagged, merged back to `develop` +- Hotfix branches directly of and to `main` +- **Good for**: software with users, larger teams +- There is a tool `git-flow`, a wrapper around `git`, e.g. `git flow init` ... but not really necessary IMHO + +--- + +## Forking Workflow + +- Gitflow + feature branches on other forks +- More control over access rights, distinguish between maintainers and external contributors +- Should maintainers also use branches on their forks? + - Makes overview of branches easier + - Distinguishes between prototype branches (on fork, no PR), serious enhancements (on fork with PR), joint enhancements (on upstream) +- **Good for**: open-source projects with external contributions (used more or less in preCICE) + +--- + +## Do Small PRs + +- For all workflows, it is better to do small PRs + - Easier to review + - Faster to merge --> fewer conflicts + - Easier to squash + +--- + +## Quick reads + +- [Atlassian docs on workflows](https://www.atlassian.com/git/tutorials/comparing-workflows) +- [Original gitflow blog post](https://nvie.com/posts/a-successful-git-branching-model/) +- [Trunk-based development](https://www.atlassian.com/continuous-delivery/continuous-integration/trunk-based-development) +- [GitHub flow](https://guides.github.com/introduction/flow/) +- [How to keep pull requests manageable](https://gist.github.com/sktse/569cb192ce1518f83db58567591e3205) diff --git a/material/3_wed/.gitkeep b/material/3_wed/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/material/4_thu/.gitkeep b/material/4_thu/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/material/5_fri/.gitkeep b/material/5_fri/.gitkeep new file mode 100644 index 0000000..e69de29