# 2022 UC Carpentries Fall Workshop (Version Control w/ Git)
**Workshop Details**
Dates: September 6th - 13th, 2022
Time: 9am - 12pm
**Workshop Agenda:**
https://ucsdlib.github.io/2022-09-06-carpentries-uc/
## Day 5: Version Control w/ Git
**Software Installation:**
Git should be installed on your device from the Day 4 session.
Session lesson-by-Lesson overview and cheatsheet links: https://swcarpentry.github.io/git-novice/reference.html
## Workshop Day 5
### First name and Last Name/Organization/Dept./Email
| Name | Dept. | Email | |
| --- | ------------------------------ | ---------------------------- | --- |
| | IT | jdoe1@ucsd.edu | |
| Geno Sanchez | UCLA Library | genosanchez@library.ucla.edu | |
| | Economic | indeankrehel@yahoo.com | |
| | Epidemiology and Biostatistics | apisit.kaewsanit@ucsf.edu | |
| | Scripps | nrosenberg@ucsd.edu | |
| | Pediatrics | aleszczynska@ucsd.edu | |
| Yulissa Perez Rojas | Environ. | yperezrojas@ucmerced.edu | |
|Alexander Frey | UCSD, Rady School of Management | alexander.frey@rady.ucsd.edu | |
| | ETS | jaychi@ucsb.edu | |
| | Cell and Developmental Biology | aheidbrink@uscd.edu | |
| | CMM | bah@ucsd.edu | |
| Oishee Misra | Economics | omisra@ucsd.edu | |
| Josue Duque | QSB | jduque2@ucmerced.edu | |
| Melodi Frey | UCSD | CMM | mtastemel@health.ucsd.edu |
|John Thompson |UC Merced |jthompson44@ucmerced.edu | |
| | Psychology | wollermi000@gmail.com | |
|Mario Cuaya |Computer Science | mcuay001@student.rccd.edu | |
| | | | |
| | Public Policy | lzimmerman@g.ucla.edu | |
| Dexin Zhou | Mathematics | dzhou@ucsd.edu | |
| Douglas Zhang | Chemistry and Biochemistry | UCSD | doz023@ucsd.edu |
| | Mathematics | jle173@ucr.edu | |
| Jacobus Kats | UCR | ITS | bart.kats@ucr.edu |
| Govind Sah | UCSD Pathology | gsah@health.ucsd.edu | |
| Charles Faulhaber |Spanish & Portuguese UCB||cbfberkeley.edu | | |
|Stella Yuan |Ecology and Evolutionary Biology |UCLA |scy8@ucla.edu |
|Julia | Nat Sci| | | | |
|Josiah Piceno|MBSE |jpiceno3@ucmerced.edu| |
| Shang Su | Cell and Cancer Biology | U Toledo | shang.su@utoledo.edu |
| Leila Fattel | Agronomy | lfattel@iastate.edu | |
|Jun Tan |Economics|UCSD|j4tan@ucsd.edu
| Kazuma Nagatsuka | Robotics(Mechani) |knagatsuka@ucsd.edu |
|Ha Vu | UCSD | Economics | vha@ucsd.edu |
|Zhaoning (Johnny) Wang |UCSD|CMM|zhw063@health.ucsd.edu|
|Elizabeth (Lisa) McAulay| UCLA | Library |emcaulay@library.ucla.edu|
|Donald Zarate| UCR | Political Science and Psychology | dzara016@ucr.edyy |
|Sam Erickson | UC Merced | Physics | serickson3@ucmerced.edu |
|Daryl Han | UC Irvine | Student Center and Event Services | ddhan@uci.edu |
|Andrew Chan | UCSD | IGPP | andrewchan@ucsd.edu|
|Jessica Wu-Woods| UCR | Microbiology| jwuw001@ucr.edu
## NOTES:
A copy of the instructor live session notes will be made available to participants upon request at the end of the workshop.
**setup:**
Windows users download **Git for Windows**: https://gitforwindows.org/
Mac/Linux users already have Git installed. Just open the **Terminal** app
```bash!t
#MacOS
cd Desktop
#Windows
cd /c/Users/username/Desktop/
```
## References
Carpentries Git reference guide: Key Points: https://swcarpentry.github.io/git-novice/reference.html
https://education.github.com/git-cheat-sheet-education.pdf
## What is Version Control
Tracking files over time. Allowing you to save previous versions and be able to look at them.
##
## Automated Version Control
Version control systems start with a base version of the document and then record changes you make each step of the way.
Git is traditionally done in the Command Line Interface (CLI).
There are a variety of software applications for working in Git. These may be helpful in free version for students of a program called Tower:
Version control is like an unlimited ‘undo’ and allows users to work in parallel.
# Setup for Git
`git config`
```git
git config --global user.name "Vlad Dracula"
git config --global user.email "vlad@tran.sylvan.ia"
```
Please use your own name and email address instead of Dracula’s. This user name and email will be associated with your subsequent Git activity, which means that any changes pushed to GitHub, BitBucket, GitLab or another Git host server after this lesson will include this information.
We will be using Github for this lesson. You can sign up for a Github account here: https://github.com/
## Line Endings
MacOS
```git
$ git config --global core.autocrlf input
```
Windows
```git
$ git config --global core.autocrlf true
```
As with other keys, when you hit Enter or ↵ or on Macs, Return on your keyboard, your computer encodes this input as a character.
Read more here: https://www.git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_autocrlf
Find what version of git your computer is using
```git
git -v
#or
git --version
git version 2.37.3
#version might be different for you
```
## Default editors
```git
# nano
$ git config --global core.editor "nano -w"
```
Commands for other editors: https://git-scm.com/book/en/v2/Appendix-C%3A-Git-Commands-Setup-and-Config
```bash
ls -lh
#your gitconfig file should be in your home directory
nano .gitconfig
#where your git settings are saved
```
## Setup your default branch
In 2020, most Git code hosting services transitioned to using the name 'main' to designate the default branch of the repository. However, the Git setup still uses 'master' as the default branch name, so you need to reset it. As an example, any new repository that is opened in GitHub and GitLab default to main. As a result, local repositories must be manually configured have the same main branch name as most cloud services.
```git
git config --global init.defaultBranch main
```
Will display your settings in your Terminal window:
```git
git config --list
```
Git Help and Manual
```git
git config -h
git config --help
```
Press Q to exit Help screen
# Creating a Repository
First, let’s create a new directory in the Desktop folder for our work and then change the current working directory to the newly created one:
```bash
cd ~/Desktop
mkdir planets
cd planets
```
Then we tell Git to make planets a repository – a place where Git can store versions of our files:
```git
git init
```
It will create a git repository in the `planets` directory
Git uses this special subdirectory to store all the information about the project, including the tracked files and sub-directories located within the project’s directory. If we ever delete the .git subdirectory, we will lose the project’s history.
```bash
ls -a
. .. .git
```
Next, we will change the default branch to be called main. This might be the default branch depending on your settings and version of git.
```git
git checkout -b main
Switched to a new branch 'main'
```
We can check that everything is set up correctly by asking Git to tell us the status of our project:
```git
git status
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
```
# Tracking Changes
First let’s make sure we’re still in the right directory. You should be in the planets directory.
```bash
cd ~/Desktop/planets
```
Create a text file:
```bash!
nano mars.txt
```
type:
`Cold and dry, but everything is my favorite color.`
Press CTRL O to save
Hit Enter to confirm save
Press CTRL X to exit nano
```bash!
ls
mars.txt
cat mars.txt
Cold and dry, but everything is my favorite color.
```
```git!
git status
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
mars.txt
nothing added to commit but untracked files present (use "git add" to track)
```
We can tell Git to track a file using `git add`:
```git
git add mars.txt
git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: mars.txt
```
Record changes as a commit:
```git!
git commit -m "Start notes on Mars as a base"
#output:
[main (root-commit) f22b25e] Start notes on Mars as a base
1 file changed, 1 insertion(+)
create mode 100644 mars.txt
```
If we want to know what we’ve done recently, we can ask Git to show us the project’s history using git log:
```git
git log
#output:
commit f22b25e3233b4645dabd0d81e651fe074bd8e73b
Author: Vlad Dracula <vlad@tran.sylvan.ia>
Date: Thu Aug 22 09:51:46 2013 -0400
Start notes on Mars as a base
```
`git log` lists all commits made to a repository in reverse chronological order. The listing for each commit includes the commit’s full identifier (which starts with the same characters as the short identifier printed by the git commit command earlier), the commit’s author, when it was created, and the log message Git was given when the commit was created.
## Adding to your text file:
```bash!
nano mars.txt
#output:
Cold and dry, but everything is my favorite color.
The two moons may be a problem for Wolfman.
```
Press CTRL O to save
Hit Enter to confirm save
Press CTRL X to exit nano
### Check status of your mars.txt file:
```git!
git status
#output:
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: mars.txt
no changes added to commit (use "git add" and/or "git commit -a")
```
### Show us the differences between the current state of the file and the most recently saved version:
```git!
git diff
#output:
diff --git a/mars.txt b/mars.txt
index df0654a..315bf3a 100644
--- a/mars.txt
+++ b/mars.txt
@@ -1 +1,2 @@
Cold and dry, but everything is my favorite color
+The two moons may be a problem for Wolfman
```
### Adding more lines to your text file:
```bash!
nano mars.txt
#output:
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
```
Press CTRL O to save
Hit Enter to confirm save
Press CTRL X to exit nano
### Reverting to the previous change
```bash!
git restore mars.txt
#removes the latest change
nano mars.txt
#output:
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
```
### commiting our changes
```git!
git commit -m "Discuss concerns about Mars' climate for Mummy"
#output:
[main 005937f] Discuss concerns about Mars' climate for Mummy
1 file changed, 1 insertion(+)
```
```bash!
git status
#output
On branch main
nothing to commit, working directory clean
```
### and look at the history of what we’ve done so far:
```bash!
git log
#output:
commit 005937fbe2a98fb83f0ade869025dc2636b4dad5 (HEAD -> main)
Author: Vlad Dracula <vlad@tran.sylvan.ia>
Date: Thu Aug 22 10:14:07 2013 -0400
Discuss concerns about Mars' climate for Mummy
commit 34961b159c27df3b475cfe4415d94a6d1fcd064d
Author: Vlad Dracula <vlad@tran.sylvan.ia>
Date: Thu Aug 22 10:07:21 2013 -0400
Add concerns about effects of Mars' moons on Wolfman
commit f22b25e3233b4645dabd0d81e651fe074bd8e73b
Author: Vlad Dracula <vlad@tran.sylvan.ia>
Date: Thu Aug 22 09:51:46 2013 -0400
Start notes on Mars as a base
```
## Directories
1. Git does not track directories on their own, only files within them
```bash!
mkdir spaceships
git status
git add spaceships
git status
#changes are not shown until you edit a file
```
2. If you create a directory in your Git repository and populate it with files, you can add all files in the directory at once by:
```bash!
git add <directory-with-files>
touch spaceships/apollo-11 spaceships/sputnik-1
git add spaceships
git status
#output will show both new files ready for commit
```
```git
git commit -m "Add some initial thoughts on spaceships"
```
# Remotes in GitHub
## Github setup
https://docs.github.com/en/authentication/connecting-to-github-with-ssh/checking-for-existing-ssh-keys
How to check your setup, type into terminal:
ssh -T git@github.com
You should get a message back from github that says "Hi Vlad Dracula" (with your actual name!)
## Create a remote repo
log into GitHub: https://github.com/
then click on the icon in the top right corner to create a new repository called `planets`:
As soon as the repository is created, GitHub displays a page with a URL and some information on how to configure your local repository:
e.g.: https://github.com/username/planets.git (your link will be slightly different)
Copy that URL from the browser, go into the local planets repository, and run this command:
```git!
#make sure your working directory is planets
git remote add origin git@github.com:USERNAME/planets.git
#pushes your local changes to the GitHub repo (remote)
git push -u origin main
#output:
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (16/16), 1.45 KiB | 372.00 KiB/s, done.
Total 16 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To https://github.com/vlad/planets.git
* [new branch] main -> main
```
## Pulling changes from remote
```bash!
#when edits are made somewhere else like GitHub's code editor you can pull those changes to your local machine
git pull origin main
```
Connection issues:
1. Go to settings and select SSH and GPG keys on left side panel
2. create a new SSH key
* steps: https://swcarpentry.github.io/git-novice/07-github/index.html#31-create-an-ssh-key-pair
## Day 5 Questions:
Please enter any questions not answered during live session here:
1.
### End Day 5