# git basics ## for beginner-level git users notes: - if you have questions ask them right away - hand out cheat sheets later, no need to write stuff down
## objectives - teach you to fish - hands-on experience - use version control! - collaborate!
## about me - scientific computing support @ idiv since 2014 - happy git user since 2010 > There will never be a better version control system than git. > > -- Christian Krause, Chemnitz 2017
## about today be able to ... 1. use git in **ALL** your projects 2. collaborate with each other ... is mission accomplished. notes: - there is time for fancy stuff later - take a few weeks getting used to git - delay is good to grow your own experience - growing pain is how we learn
## about you ![people](img/people.jpg) name, job, git experience, why git?
## about git 1. **records changes to a *repository*** content, who, when, message 2. **best tool for the job** technical, usability, community notes: - the fact that content is organized in files and directories is only incidental - for git to be useful, content has to be text
# motivation > Why should I use git?
## motivation #1 ### avoid mess ![blah](img/draft_mess.png) notes: - who has seen such a mess? - who has contributed to such a mess? - who has created such a mess?
## motivation #1 ### want structure ![blah](img/gitk-pretty-history.png) notes: - TODO better repo with more contributors
## 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 - (done right) decision based on regression testing
## motivation #3 ![boy scout rule](img/boy-scout-rule.jpg) notes: - there's a rule in open source software ... - at least open issue - if trivial to fix: do it!
## motivation #3 ### collaboration made easy > This text cuntains 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 - commit message: ``` fixes typo learn how to use a spell checker ```
## motivation #4 ### the creative use of git award #### goes to Michael Schilli ```yml videos: - id: '_3i5yVoTvCs' title: 'How to flip German pancakes' - id: 'brPfE66FC24' title: 'Tivo Stream Cooling Fan Replacement' ``` ```console $ youtube-sync -i videos.yml _3i5yVoTvCs: Unchanged brPfE66FC24: Updated OK ``` source: [Linux Magazin](http://www.linux-magazin.de/) 2018/01
## motivation #e ### use version control for # *everything* | common | less frequent | esoteric? | | ------------ |:---------------:| ---------------:| | software | presentation | youtube | | blog | paper / thesis | soundboard | | user config | task management | drinking games | notes: - if it doesn't support git don't use it
## motivation #a ### automation - software testing - code quality - build app and deploy to app store - put presentation on web server *(see advanced seminar)* notes: - basically, everything you can script
# setup notes: - git is simple and complex - git seems complex for 2 reasons: - you're unfamiliar with command line - there are a lot of choices - only X (TODO) theory/internals pages - I'm gonna dumb it down for you - aka we'll stick to the simple parts
## command line - Ellen Ripley uses command line - Chuck Norris uses command line
## os packages - **Linux:** bash and git - **Mac:** bash and git - **Windows:** cmder
## command line ### description syntax ```bash # command git # sub-command git status # optional git diff [--staged] ```
## command line ### git syntax ```bash # every git command git command [arguments] # get help git help [command] ```
## git setup ```bash # configure your identity git config --global user.name 'Jane Doe' git config --global user.email 'jane.doe@riot-grrrl.org' # show colors git config --global color.ui auto # editor git config --global core.editor emacs # configure aliases git config --global alias.unstage 'reset HEAD --' git config --global alias.lol \ 'log --graph --decorate --oneline --all' ```
# git command line ## local repositories
## command line ### create repositories ```bash # create empty repository git init project-name # create repository from existing project # which is not under version control cd path/to/project git init ```
## command line ### git status ```bash # show status and what to do git status ``` notes: - important git command - shows a lot of information - shows basic git commands - later, we'll see different outputs
## internals ### the staging area ![staging area](img/staging-area.svg)
## command line ### file handling ```bash # use staging area git stage file git unstage file # discard changes git checkout file # rename and remove git mv source destination git rm file ```
## 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 ```
## command line ### commit changes ```bash # opens editor for you to edit commit message git commit # commits with a short message git commit -m 'adds license and readme' ```
## TODO
## command line ### view history ```bash # show all commits git log # show all commits plus diff git log --patch # shows condensed view of history, i.e. # - only commit message subjects # - one per line git lol ```
## demo ### basic commands notes: - mkdir ~/projects - git init hello - README.md - LICENSE - src/hello.py
## software licenses ![software licenses](img/license-chooser.svg) https://choosealicense.com
## no license - exclusive copyright to **each!** author - **no one** can use, copy, distribute and modify - platform: terms of service https://choosealicense.com
## other licenses - media, documentation: creative commons - paper / thesis: journal vs legal department https://choosealicense.com
# [cheat sheet](https://idiv-biodiversity.github.io/git-cheat-sheet/)
# your turn - pick project - make commits - use status and diff! notes: - deputize those who already have
# break
# distributed ## version control system
## git usage until now - has all been local - repo contains entire project history - not yet answered: - how to publish? - how to contribute?
## remotes ![remotes](img/git-remote-solo.svg)
### how do i get remotes? # web apps - GitLab demo - GitHub (no demo)
## command line ### clone repositories ```bash # create local copy of existing repository git clone https://github.com/user/project-name.git ```
## your turn - log in - create project - fetch / push / pull
# collaboration
## command line ### git ```bash ```
## command line ### git ```bash ```
# homework
## homework #1 ### use git for each project you use ... ... create repository in GitLab ... ... and commit changes!
## homework #2 ### collaborate - talk with your colleagues - organize project(s) you use together - open issues for problems and features - contribute via merge requests - review commits and merge requests
## homework #3 be friendly be responsible be open be creative be proactive have fun

EOF

edit