Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • sc/edu/git-seminar
  • mk21womu/git-seminar
2 results
Select Git revision
Show changes
Commits on Source (25)
Showing
with 917 additions and 137 deletions
......@@ -4,7 +4,13 @@ img/git-remote-solo.svg
img/license-chooser.svg
img/motivation-structure.svg
img/motivation-throwaway-playground.svg
img/rdm-use-case-data.svg
img/rdm-use-cases-a.svg
img/rdm-use-cases-b.svg
img/rdm-use-cases.svg
img/staging-area.svg
paper.html
paper.pdf
*.pdf
img/staging-area-diff.svg
/img/rdm-use-case-merged.svg
[submodule "reveal.js"]
path = reveal.js
url = https://github.com/hakimel/reveal.js.git
[submodule "pandoc-cheat-sheet"]
path = pandoc-cheat-sheet
url = https://github.com/idiv-biodiversity/pandoc-cheat-sheet.git
......@@ -17,12 +17,22 @@ pandoc-papers.pdf: pandoc-papers.md
-o pandoc-papers.pdf \
pandoc-papers.md
rdm.pdf: img rdm.md rdm.yml
pandoc \
--standalone \
--from=markdown+yaml_metadata_block \
--pdf-engine=xelatex \
--template=pandoc-cheat-sheet/cheat-sheet.tex \
-o rdm.pdf \
rdm.yml rdm.md
all: subdirs
clean:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir $@; \
done
rm -f rdm.pdf
default: all
......
# regular FAQ
- 10-12 git integration RStudio / VS Code / others
- 13-15 GitLab / GitHub project setup / importing existing projects / how to start and continue after that, project management, issue management
- 15-16 GitLab / GitHub automation
- 16-18 free for all
# git advanced -- how to maintain a comprehensible history
- when projects get bigger
......
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="author" content="Dirk Sarpe and Christian Krause" />
<title>git basics</title>
<meta name="description" content="a git seminar for beginners" />
<meta name="author" content="Dirk Sarpe and Christian Krause" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<link rel="stylesheet" href="reveal.js/css/reveal.css" />
<link rel="stylesheet" href="reveal.js/lib/css/zenburn.css" />
<style type="text/css">code{white-space: pre;}</style>
<link rel="stylesheet" href="reveal.js/css/theme/black.css" id="theme" />
<link rel="stylesheet" href="reveal.js/dist/reset.css">
<link rel="stylesheet" href="reveal.js/dist/reveal.css">
<link rel="stylesheet" href="reveal.js/dist/theme/black.css" id="theme">
<link rel="stylesheet" href="reveal.js/plugin/highlight/monokai.css">
<link rel="stylesheet" href="css/company-logo.css" />
<link rel="stylesheet" href="css/ribbon.css" />
<link rel="stylesheet" href="css/crawl.css" />
......@@ -41,15 +48,6 @@
- cleanup https://git.idiv.de/sc/edu/git-merge-conflict-demo
</section>
<section id="intro-objectives" data-markdown>
## objectives
- teach you to fish
- hands-on experience
- use version control!
- collaborate!
</section>
<section id="intro-goals" data-markdown>
## goals
......@@ -68,25 +66,27 @@
<section id="intro-agenda-1" data-markdown>
## agenda (today)
1. intro and installation
1. setup and local repositories
1. remote repositories and collaboration
1. motivation
1. install and setup
1. recording changes
1. platforms and remotes
1. collaboration
note:
- we have dynamic breaks, try at most 90 minutes without break
</section>
<section id="intro-agenda-2" data-markdown>
## agenda (tomorrow)
## agenda (advanced)
1. customization (editors, IDEs)
1. project & team setup (GitLab)
1. how to project maintainer
1. (automation)
1. automation
note:
- in smaller groups
- while today is more general, tomorrow will be focused on your
- while today is more general, advanced will be focused on your
specific situation
</section>
......@@ -96,6 +96,11 @@
> records changes
what, who, when, why
note:
- different kinds of version control systems
- for different meta-level things
- git is for text files / source code
</section>
<section id="intro-about-git" data-markdown>
......@@ -118,7 +123,7 @@
<section id="intro-about-christian" data-markdown>
## about christian
- scientific computing support @ iDiv since 2014
- [scientific computing support @ iDiv](https://www.idiv.de/en/about-idiv/support-for-scientists/scientific-computing.html) since 2014
- happy git user since 2010
> There will never be a better version control system than git.
......@@ -126,15 +131,6 @@
> -- Christian Krause, 2017
</section>
<section id="intro-about-dirk" data-markdown>
## about dirk
- statistics and R support @ iDiv since 2014
- knows that kind of pain:
![blah](img/motivation-draft-mess-half-size.png)
</section>
<section id="intro-about-you" data-markdown>
## about you
......@@ -155,7 +151,7 @@
<section id="motivation" data-markdown>
# motivation
> Why should I use version control?
> Why should ***I*** use version control?
notes:
- summarize reasons from audience
......@@ -210,11 +206,8 @@
> This text cntains a typo.
notes:
- demo GitLab
- [go to project](https://git.idiv.de/sc/edu/git-seminar)
- check if typo still in master
- edit
- change **target branch** to create merge request
- demo **edit** ribbon
- change target branch (creates MR) to: **basics/typo**
- commit message:
```
fixes typo
......@@ -244,7 +237,7 @@
- enforce **style guide** aka *code formatting*
- ***deployment*** (app store, web server)
*(see advanced seminar or tomorrow)*
*(see advanced)*
notes:
- buzzwords:
......@@ -420,24 +413,30 @@
```
</section>
<section id="cheat-sheet" data-markdown>
## cheat sheet
https://idiv-biodiversity.github.io/git-cheat-sheet/
</section>
<section id="setup-git-1" data-markdown>
## git setup #1
```bash
# configure your identity
git config --global user.name 'Jane Doe'
git config --global user.email 'jane.doe@riot-grrrl.org'
git config --global user.name "Jane Doe"
git config --global user.email "jane.doe@idiv.de"
# show colors
git config --global color.ui auto
# configure aliases
git config --global alias.unstage 'reset HEAD --'
git config --global alias.unstage "reset HEAD --"
git config --global alias.lol \
'log --graph --decorate --oneline --all'
"log --graph --decorate --oneline --all"
# show config
git config --global --list
git config --list [--global]
```
notes:
......@@ -454,14 +453,14 @@
git config --global core.editor notepad
# Mac
git config --global core.editor 'open -Wne'
git config --global core.editor "open -Wne"
# Linux GNOME / KDE
git config --global core.editor gedit
git config --global core.editor kate
# to verify editor works
git config --edit
git config --global --edit
```
notes:
......@@ -579,23 +578,16 @@
notes:
- users should do this in a terminal with demo by us
- git stage git add are the same thing
- prefer stage and unstage because the opposite of add is remove
and that does something entirely different
- `git stage` and `git add` are the same thing
- prefer `stage` and `unstage` because the opposite of `add` is
`rm` and that does something entirely different
</section>
<section id="cli-git-diff-1" data-markdown>
<section id="cli-git-diff" data-markdown>
## command line
### show changes
```bash
# from staging area to current working copy
git diff
# show contents of staging area, i.e.
# from last commit to staging area
git diff --staged
```
![git diff](img/staging-area-diff.svg)
notes:
- users should do this in a terminal with demo by us
......@@ -611,7 +603,7 @@
git commit [-v]
# commits with a short message
git commit -m 'initial commit'
git commit -m "initial commit"
```
notes:
......@@ -675,9 +667,14 @@
<section id="summary-1" data-markdown>
## you can now
- track changes in your projects
- browse your projects history
- see why a change was introduced
- create local repos (`init`)
- track changes in your projects (`stage`, `commit`)
- browse your projects history (`log`)
- rest are helpers (`status`, `diff`, `restore`)
notes:
- very important: `status`
- demo emacs git integration to show `stage -p`
</section>
<section id="summary-2" data-markdown>
......@@ -803,10 +800,11 @@
![remotes](img/git-remote-solo.svg)
notes:
- remotes have names, default to origin
- remotes are **full clones**, i.e. entire history
- **fetch** is on the box, so you **fetch everything**
- **fetch** does not integrate branches, i.e. **merge**
- remotes have names, default to **origin**
- remotes are usually **full clones**, i.e. entire history, all
commits, all branches
- **fetch** edge is on the box, so you fetch **everything**
- **fetch** does not integrate branches, i.e. no **merge**
- **push** and **pull** also **merge** the *tracking* branch
</section>
</section>
......@@ -822,7 +820,7 @@
notes:
- this is a demo chapter, you will all do this in collaboration
chapter (next one)
- what was this **master** again? we have not explained yet
- what was this **main** again? we have not explained yet
</section>
<section id="branch-visual" data-markdown>
......@@ -835,7 +833,7 @@
- create a branch to have a separate history
- branch is a name attached to a commit
- the name advances when a new commit is made
- **master** is a naming convention for the default branch
- **main** is a naming convention for the default branch
- switch back and forth
- always imagine git history as a directed graph
- graph is drawn with new top and old bottom
......@@ -846,7 +844,7 @@
<section id="branch-when-to-use" data-markdown>
## when to use branches
- breaking **master**
- breaking **main**
- something takes longer
- frequent interruptions
- (instead of) comment out code
......@@ -901,7 +899,7 @@
```
notes:
- `git branch --list 'topic/*'`
- `git branch --list "topic/*"`
- decide with your team, write `CONTRIBUTING.md`
</section>
......@@ -910,7 +908,7 @@
```bash
# resolve branch by merging
git switch master
git switch main
git merge branch-name
# delete branch
......@@ -919,7 +917,7 @@
notes:
```
# switch master, lol
# switch main, lol
# merge wip/feature, lol
# branch -d wip/feature, lol
```
......@@ -948,14 +946,14 @@
notes:
- we: new commit
- group: fetch, lol, pull upstream master, lol
- group: fetch, lol, pull upstream main, lol
- group: push origin, lol
- group: branch, switch, commit, push, MR
- collaboration happens in issues and MR discussion!
- we: review and possible resolve merge request in GL
- show next slide once merging is done on command line
- we: review one MR, show line comments in GL, thumbs up
- tomorrow: view of maintainer
- advanced: view of maintainer
</section>
<section id="collab-review-criticism" data-markdown>
......@@ -981,7 +979,7 @@
```bash
git fetch upstream
git switch topic/feature
git merge origin/master
git merge origin/main
# fix conflicts
git push
```
......@@ -1000,8 +998,9 @@
<section id="summary-3" data-markdown>
## you can now
- create and connect to remotes
- contribute to projects
- create and connect to remotes (`clone`, `push/pull`)
- contribute to projects (`switch -c`, `push -u origin`, MR/PR)
- hint: use `lol` alias
</section>
<section id="summary-4" data-markdown>
......@@ -1014,12 +1013,11 @@
<section>
<section id="homework" data-markdown>
# homework
## (or tomorrow)
# "homework"
</section>
<section id="homework-use-git" data-markdown>
## homework #1
## "homework" #1
### use git
for each project you use ...
......@@ -1037,7 +1035,7 @@
</section>
<section id="homework-collaborate" data-markdown>
## homework #2
## "homework" #2
### collaborate
- talk with your colleagues
......@@ -1049,7 +1047,7 @@
</section>
<section id="homework-feedback" data-markdown>
## homework #3
## "homework" #3
### feedback
https://git.idiv.de/sc/edu/git-seminar
......@@ -1059,6 +1057,20 @@
</section>
</section>
<section id="intro-agenda-2" data-markdown>
## agenda advanced
1. customization (editors, IDEs)
1. project & team setup (GitLab)
1. how to project maintainer
1. automation
note:
- in smaller groups
- while today is more general, advanced will be focused on your
specific situation
</section>
<section id="eof" data-background="img/trex.png">
<h1>EOF</h1>
</section>
......@@ -1075,7 +1087,7 @@
```bash
git remote add alice https://...
git fetch alice
git rebase [--interactive] master alice/topic/feature
git rebase [--interactive] main alice/topic/feature
# fix conflicts
git push
# manually close merge request
......@@ -1091,7 +1103,7 @@
```bash
git fetch upstream
git rebase origin/master topic/feature
git rebase origin/main topic/feature
# fix conflicts
# force push because branch history changed
git push --force
......@@ -1125,7 +1137,7 @@
```bash
git remote add alice https://...
git fetch alice
git switch master
git switch main
git merge alice/topic/feature
# fix conflicts
git push
......@@ -1150,7 +1162,7 @@
<div class="ribbon-wrapper right">
<div class="ribbon">
<a href="https://git.idiv.de/sc/edu/git-seminar/edit/master/basics.html"
<a href="https://git.idiv.de/sc/edu/git-seminar/edit/main/basics.html"
target="_blank">
edit
</a>
......@@ -1159,30 +1171,28 @@
<!-- reveal.stuff -->
<script src="reveal.js/lib/js/head.min.js"></script>
<script src="reveal.js/js/reveal.js"></script>
<script src="reveal.js/dist/reveal.js"></script>
<script src="reveal.js/plugin/zoom/zoom.js"></script>
<script src="reveal.js/plugin/notes/notes.js"></script>
<script src="reveal.js/plugin/search/search.js"></script>
<script src="reveal.js/plugin/markdown/markdown.js"></script>
<script src="reveal.js/plugin/highlight/highlight.js"></script>
<script>
Reveal.initialize({
controls: true,
progress: true,
slideNumber: true,
history: true,
center: true,
keyboard: true,
maxScale: 1.5,
slideNumber: false,
theme: Reveal.getQueryHash().theme,
transition: Reveal.getQueryHash().transition || 'default',
dependencies: [
{ src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'reveal.js/plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
{ src: 'reveal.js/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } },
{ src: 'reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
]
controls: true,
progress: true,
center: true,
hash: true,
plugins: [
RevealZoom,
RevealNotes,
RevealSearch,
RevealMarkdown,
RevealHighlight,
]
});
</script>
</body>
......
......@@ -6,7 +6,7 @@ digraph {
node [color = orchid]
omaster[label = "master"]
omain[label = "main"]
}
subgraph clusterlocal {
......@@ -14,7 +14,7 @@ digraph {
node [color = orchid]
master[label = "master"]
main[label = "main"]
}
subgraph clusterupstream {
......@@ -22,11 +22,11 @@ digraph {
node [color = limegreen]
umaster[label = "master"]
umain[label = "main"]
}
omaster -> master [label = "git pull"]
master -> omaster [label = "git push", constraint = false]
umaster -> master [label = "git pull upstream master", constraint = false]
omaster -> umaster [label = "pull request (GitHub)\nmerge request (GitLab)", constraint = false]
omain -> main [label = "git pull"]
main -> omain [label = "git push", constraint = false]
umain -> main [label = "git pull upstream main", constraint = false]
omain -> umain [label = "pull request (GitHub)\nmerge request (GitLab)", constraint = false]
}
......@@ -6,7 +6,7 @@ digraph {
node [color = orchid]
omaster[label = "master"]
omain[label = "main"]
}
subgraph clusterlocal {
......@@ -14,7 +14,7 @@ digraph {
node [color = orchid]
master[label = "master"]
main[label = "main"]
}
subgraph clusteralice {
......@@ -22,7 +22,7 @@ digraph {
node [color = limegreen]
amaster[label = "master"]
amain[label = "main"]
}
subgraph clusterbob {
......@@ -30,11 +30,11 @@ digraph {
node [color = lightskyblue]
bmaster[label = "master"]
bmain[label = "main"]
}
omaster -> master [label = "git pull"]
master -> omaster [label = "git push", constraint = false]
amaster -> master [label = "git pull alice", constraint = false]
bmaster -> master [label = "git pull bob", constraint = false]
omain -> main [label = "git pull"]
main -> omain [label = "git push", constraint = false]
amain -> main [label = "git pull alice", constraint = false]
bmain -> main [label = "git pull bob", constraint = false]
}
......@@ -9,7 +9,7 @@ digraph {
node [color = orchid]
omaster[label = "master"]
omain[label = "main"]
}
subgraph clusterlocal {
......@@ -17,10 +17,10 @@ digraph {
node [color = orchid]
master[label = "master"]
main[label = "main"]
}
omaster -> master [label = "git fetch", style = dotted, ltail = clusterorigin, lhead = clusterlocal]
master -> omaster [label = "git push"]
omaster -> master [label = "git pull"]
omain -> main [label = "git fetch", style = dotted, ltail = clusterorigin, lhead = clusterlocal]
main -> omain [label = "git push"]
omain -> main [label = "git pull"]
}
digraph {
node [shape = "box", style = "filled, rounded"]
master4[label = "Dirk (today)\nupdates methods chapter", color = limegreen]
master3[label = "Christian (yesterday)\nfixes typos", color = darkorchid1]
master2[label = "Dirk (three days ago)\nadds methods chapter", color = limegreen]
master4[label = "Alice (today)\nfixes logic error", color = limegreen]
master3[label = "Bob (yesterday)\nfixes typos", color = darkorchid1]
master2[label = "Alice (three days ago)\nadds methods chapter", color = limegreen]
master1[label = "...", color = grey]
master4 -> master3 -> master2 -> master1
......
digraph {
node [shape = "box", style = "filled, rounded"]
subgraph clustermaster {
label = "master"
subgraph clustermain {
label = "main"
node [color = limegreen]
master3[label = "..."]
master2[label = "..."]
master1[label = "..."]
main3[label = "..."]
main2[label = "..."]
main1[label = "..."]
master3 -> master2 -> master1
main3 -> main2 -> main1
}
subgraph clusterplayground {
......@@ -24,5 +24,5 @@ digraph {
playground2 -> playground1
}
playground1 -> master2
playground1 -> main2
}
digraph {
compound = true
node [shape = "box", style = "filled, rounded"]
subgraph cluster_script {
label = "scripts"
node [color = lightskyblue]
script_version_b[label = "nature-v2"]
}
subgraph cluster_data {
label = "data repository (not git!)"
node [color = limegreen]
data_version_a[label = "doi:blah/blah"]
}
subgraph cluster_paper {
label = "paper"
node [color = limegreen]
paper_version_c[label = "nature-final"]
}
paper_version_c -> data_version_a [label = "\n\n", lhead = cluster_data]
data_version_a -> script_version_b [label = "\n\n", lhead = cluster_script]
}
digraph {
compound = true
node [shape = "box", style = "filled, rounded"]
subgraph cluster_script {
label = "scripts"
node [color = lightskyblue]
script_version_b[label = "nature-v2"]
script_version_a[label = "nature-v1"]
}
subgraph cluster_data {
label = "data repository (not git!)"
node [color = limegreen]
data_version_a[label = "doi:blah/blah"]
}
subgraph cluster_paper {
label = "paper"
node [color = limegreen]
paper_version_a[label = "nature-review-1"]
paper_version_b[label = "nature-review-2"]
paper_version_c[label = "nature-final"]
}
subgraph cluster_software_a {
label = "software A"
node [color = orchid]
software_a_version_a[label = "v2.1.6"]
}
subgraph cluster_software_b {
label = "software B"
node [color = orchid]
software_b_version_b[label = "v0.3.4"]
software_b_version_a[label = "v0.2.0"]
}
script_version_a -> software_a_version_a [label = "\n\n"]
script_version_b -> software_a_version_a [label = "\n\n"]
script_version_a -> software_b_version_a [label = "\n\n"]
script_version_b -> software_b_version_b [label = "\n\n"]
paper_version_a -> script_version_a [label = "\n\n"]
paper_version_b -> script_version_b [label = "\n\n"]
paper_version_c -> script_version_b [label = "\n\n"]
paper_version_c -> data_version_a [label = "\n\n"]
data_version_a -> script_version_b [label = "\n\n"]
}
digraph {
compound = true
node [shape = "box", style = "filled, rounded"]
subgraph cluster_software_a {
label = "software A"
node [color = orchid]
software_a_version_a[label = "v2.1.6"]
}
subgraph cluster_software_b {
label = "software B"
node [color = orchid]
software_b_version_a[label = "v0.2.0"]
}
subgraph cluster_script {
label = "scripts"
node [color = lightskyblue]
script_version_a[label = "nature-v1"]
}
subgraph cluster_paper {
label = "paper"
node [color = limegreen]
paper_version_a[label = "nature-review-1"]
}
script_version_a -> software_a_version_a [label = "\n\n"]
script_version_a -> software_b_version_a [label = "\n\n"]
paper_version_a -> script_version_a [label = "\n\n"]
}
digraph {
compound = true
node [shape = "box", style = "filled, rounded"]
subgraph cluster_software_a {
label = "software A"
node [color = orchid]
software_a_version_a[label = "v2.1.6"]
}
subgraph cluster_software_b {
label = "software B"
node [color = orchid]
software_b_version_b[label = "v0.3.4"]
software_b_version_a[label = "v0.2.0"]
}
subgraph cluster_script {
label = "scripts"
node [color = lightskyblue]
script_version_b[label = "nature-v2"]
script_version_a[label = "nature-v1"]
}
subgraph cluster_paper {
label = "paper"
node [color = limegreen]
paper_version_a[label = "nature-review-1"]
paper_version_b[label = "nature-review-2"]
}
script_version_a -> software_a_version_a [label = "\n\n"]
script_version_b -> software_a_version_a [label = "\n\n"]
script_version_a -> software_b_version_a [label = "\n\n"]
script_version_b -> software_b_version_b [label = "\n\n"]
paper_version_a -> script_version_a [label = "\n\n"]
paper_version_b -> script_version_b [label = "\n\n"]
}
digraph {
compound = true
node [shape = "box", style = "filled, rounded"]
subgraph cluster_software_a {
label = "software A"
node [color = orchid]
software_a_version_a[label = "v2.1.6"]
}
subgraph cluster_software_b {
label = "software B"
node [color = orchid]
software_b_version_b[label = "v0.3.4"]
software_b_version_a[label = "v0.2.0"]
}
subgraph cluster_script {
label = "scripts"
node [color = lightskyblue]
script_version_b[label = "nature-v2"]
script_version_a[label = "nature-v1"]
}
subgraph cluster_paper {
label = "paper"
node [color = limegreen]
paper_version_a[label = "nature-review-1"]
paper_version_b[label = "nature-review-2"]
paper_version_c[label = "nature-final"]
}
script_version_a -> software_a_version_a [label = "\n\n"]
script_version_b -> software_a_version_a [label = "\n\n"]
script_version_a -> software_b_version_a [label = "\n\n"]
script_version_b -> software_b_version_b [label = "\n\n"]
paper_version_a -> script_version_a [label = "\n\n"]
paper_version_b -> script_version_b [label = "\n\n"]
paper_version_c -> script_version_b [label = "\n\n"]
}
digraph {
node [shape = "box", style = "filled,rounded"]
workdir[label = "working directory\n(changes not staged for commit)", color = lightskyblue]
stage[label = "staging area\n(changes to be committed)", color = orchid]
repo[label = "repository\n(tracked content)", color = limegreen]
workdir -> stage [label = "git diff"]
stage -> repo [label = "git diff --staged"]
}
img/unlimited-power.jpg

54.9 KiB

Subproject commit 2346a002289757ee612bfd4b56b57db53e0c751b
......@@ -10,7 +10,7 @@ intro
## motivation #1
![](img/draft_mess_half_size.png)
![](img/motivation-draft-mess-half-size.png)
## motivation #2
......
<!DOCTYPE html>
<html>
<head>
<title>git@rdm</title>
<link rel="stylesheet" href="reveal.js/dist/reveal.css">
<link rel="stylesheet" href="reveal.js/dist/theme/black.css">
<link rel="stylesheet" href="css/company-logo.css" />
<link rel="stylesheet" href="css/ribbon.css" />
<link rel="stylesheet" href="css/crawl.css" />
</head>
<body>
<div class="reveal">
<div class="slides">
<!---------------------------------------------------------------------
<!-- intro
<!-------------------------------------------------------------------->
<section>
<section id="title" data-markdown>
# git and rdm
## (... and reproducibility)
notes:
- `make -B` to create images, then reload
</section>
<section id="intro-objectives" data-markdown>
## objectives
- show how git relates to RDM
- ... and reproducibility
</section>
<section id="intro-agenda" data-markdown>
## agenda
1. motivation
1. ~~teach ***how*** to use git/GitHub/GitLab~~
1. use cases
1. anti-patterns
1. platforms
1. Q & A
notes:
- feel free to interrupt with immediate questions
- more involved detailed discussion as part of Q & A
</section>
<section id="intro-version-control" data-markdown>
## about version control
> records changes
what who when (why)
notes:
- the **why** (aka context) is optional
- you have to do this
- you have to care about it
</section>
<section id="intro-about-git" data-markdown>
## about git
### best tool for the job
- simple by design
- powerful if needed
- documentation / community
- industry standard
notes:
- git name: "the stupid content tracker"
- doc: finding answers with web searches
</section>
<section id="intro-about-me" data-markdown>
## about me
- scientific computing support @ iDiv since 2014
- satisfied git user since 2010
> There will never be a better version control system than git.
>
> -- Christian Krause, 2017
</section>
<section id="intro-about-you" data-markdown>
## about you
![people](img/people.jpg)
notes:
- who has never used any VCS before?
- who actively maintains a VCS repository?
</section>
</section>
<!---------------------------------------------------------------------
<!-- motivation
<!-------------------------------------------------------------------->
<section>
<section id="motivation" data-markdown>
# motivation
> Why should I use version control?
notes:
- motivation chapter is about the concept of version control
- git is just a tool to do it
</section>
<section id="motivation-avoid-mess" data-markdown>
## motivation #1
### avoid mess
![blah](img/motivation-draft-mess.png)
notes:
- who has seen such a mess?
- who has contributed to such a mess?
- who has created such a mess?
</section>
<section id="motivation-want-structure" data-markdown>
## motivation #1
### want structure
![blah](img/motivation-structure.svg)
notes:
- structure: who, when
- why is hidden (only shows message header, not body)
- ability to inspect old versions and their diff
- ability to revert/undo a change
</section>
<section id="motivation-playground" data-markdown>
## motivation #2
### throw-away playgrounds
![playground](img/motivation-throwaway-playground.svg)
notes:
- test stuff without interfering
- throw away if garbage
- integrate if good
- switch back and forth without pain
</section>
<section id="motivation-collaboration-1" data-markdown>
## motivation #c
### collaboration made easy
<!-- do not fix this typo, it is here on purpose to show collab -->
> This text cntains a typo.
notes:
- demo GitLab (change **target branch** to create merge request)
- this is how you can do reviews of drafts
- discuss this slide/chapter/section link
</section>
<section id="motivation-collaboration-2" data-markdown>
## motivation #c
![typo-pr](https://pbs.twimg.com/media/EDsklbLUEAMdusJ.png)
notes:
- might not seem like much
- but you are still making the world a better place
- and it is not too much effort
</section>
<section id="motivation-automation" data-markdown>
## motivation #a
### automation
- ***quality***
- **code analysis**
- **spell check**
- **software testing**
- enforce **style guide**
- ***deployment*** (app store, web server)
notes:
- basically, everything you can script
- refresh presentation before next slide
</section>
<section class="star-wars" id="motivation-wars">
<div class="crawl">
<div class="title">
<h1>motivation #wars</h1>
</div>
<div data-markdown>
1. view the ***history*** of changes
1. know ***why*** someone changed it
1. ***revert*** a bad change
1. maintain ***multiple versions***
1. see the ***diff*** of two versions
1. find commit ***that broke*** something
1. have free ***backup***
1. have ***non-interfering*** playgrounds
1. have ***automated*** testing
1. have ***automated*** deployment
1. ***contribute*** to a project
1. ***share*** your code
1. let other people do the work ***for you***
</div>
<img src="http://i.giphy.com/90F8aUepslB84.gif" />
</div>
</section>
</section>
<!---------------------------------------------------------------------
<!-- use cases
<!-------------------------------------------------------------------->
<section>
<section id="use-cases" data-markdown>
# use cases
##### for
### version control system (vcs)
##### aka
### source code management (scm)
</section>
<section id="use-case-software" data-markdown>
## software
- generic (as in parameterized)
- (ideally) tested
notes:
- e.g. R package
</section>
<section id="use-case-scripting" data-markdown>
## scripting
##### aka
### how to run `$software`
- ... in `$environment`
- digital lab notes
- **reproducibility** !!1!
- execution scalability
notes:
- separate software from scripting
- `$enviroment`: multiple scripts/configurations for different
environments:
- EasyBuild, conda, singularity
- RStudio server, HPC cluster
- execution scalability: running software or script without having
to change it
- keep failed attempts in branches
- e.g. highly parameterized software, make a record of bad
parameter sets
</section>
<section id="use-case-publishing" data-markdown>
# publishing
### (markdown (with some tex))
- paper / thesis / book
- presentation
- documentation
- blog
notes:
- who is using markdown?
- who is using tex?
- who is using word? why?
- markdown with tex
- git.idiv.de/help
- search for markdown
- search for math
- show example
</section>
<section id="use-case-integrated-1" data-markdown>
## integration
![run `make` to generate the image](img/rdm-use-cases-a.svg)
notes:
- software A: tried and tested, reference to compare to
- software B: your experimental better version
</section>
<section id="use-case-integrated-2" data-markdown>
## integration
![run `make` to generate the image](img/rdm-use-cases-b.svg)
</section>
<section id="use-case-integrated-3" data-markdown>
## integration
![run `make` to generate the image](img/rdm-use-cases.svg)
</section>
<section id="use-case-integrated-data" data-markdown>
## integration
![run `make` to generate the image](img/rdm-use-case-data.svg)
</section>
</section>
<!---------------------------------------------------------------------
<!-- anti patterns
<!-------------------------------------------------------------------->
<section>
<section id="anti-patterns" data-markdown>
# anti-patterns
![unlimited power](img/unlimited-power.jpg)
notes:
- does anyone know what an anti-pattern is?
</section>
<section id="anti-patterns-def" data-markdown>
# anti-patterns
> An anti-pattern is a common response to a recurring problem that
is usually ineffective and risks being highly counterproductive.
notes:
- most anti-patterns about how to use git
- focus here is on these relating to RDM and reproducibility
</section>
<section id="anti-pattern-binary" data-markdown>
# binary files
### (aka non-text)
- no diff with binary
- use textual representation
- convert with automation
notes:
- can someone give me an example of text file?
- markdown
- source code, scripts (R, shell)
- XSV
- can someone give me an example of binary file?
- compiled programs
- MS word excel
- PDF PS
- don't just put everything in the repo, use *ignore
</section>
<section id="anti-pattern-big-data" data-markdown>
# data in git
## (scientific/big data)
- version control for data is **DIFF**erent !!1!
- git is VCS for text, not for data
notes:
- do you release data with every script change? no, too expensive
- you don't ever put data files in a git repository
- not even with LFS
- big ball of mud, no metadata
</section>
</section>
<!---------------------------------------------------------------------
<!-- platforms
<!-------------------------------------------------------------------->
<section>
<section id="platforms-list" data-markdown>
# platforms
- GitHub
- https://github.com/idiv-biodiversity (cloud)
- GitLab
- https://gitlab.com (cloud)
- https://git.idiv.de (self-hosted @ iDiv)
</section>
<section id="platforms-purpose" data-markdown>
# platforms
- enable collaboration
- bug tracker / feature requests
- documentation / wiki
- project management tools
- issue boards, milestones, gantt
- trigger automation
- publish/download releases
</section>
</section>
<!---------------------------------------------------------------------
<!-- q & a
<!-------------------------------------------------------------------->
<section>
<section id="q-n-a" data-markdown>
# Q & A
notes:
- walk through examples of software/script/publishing
- walk through one of your use cases
- demo consulting
</section>
<section id="consulting" data-markdown>
# consulting
[christian.krause@idiv.de](mailto:christian.krause@idiv.de)
</section>
</section>
<!---------------------------------------------------------------------
<!-- eof
<!-------------------------------------------------------------------->
<section id="eof" data-background="img/trex.png" data-markdown>
### thanks for listening
# EOF
</section>
<!---------------------------------------------------------------------
<!-- backup
<!-------------------------------------------------------------------->
<section>
<section id="backup" data-markdown>
# backup slides
</section>
<section id="empty" data-markdown>
</section>
</section>
</div>
</div>
<!-------------------------------------------------------------------------
<!-- css/js
<!------------------------------------------------------------------------>
<!-- company logo -->
<div class="logo-wrapper">
<a href="https://www.idiv.de/">
<img src="img/company-logo-small.png" />
</a>
</div>
<!-- ribbon -->
<div class="ribbon-wrapper right">
<div class="ribbon">
<a href="https://git.idiv.de/sc/edu/git-seminar/edit/main/rdm.html"
target="_blank">
edit
</a>
</div>
</div>
<!-- reveal.stuff -->
<script src="reveal.js/dist/reveal.js"></script>
<script src="reveal.js/plugin/highlight/highlight.js"></script>
<script src="reveal.js/plugin/markdown/markdown.js"></script>
<script src="reveal.js/plugin/notes/notes.js"></script>
<script>
Reveal.initialize({
hash: true,
plugins: [RevealHighlight, RevealMarkdown, RevealNotes]
});
</script>
</body>
</html>