<style> .reveal { font-size: 30px; } </style> ## Reproducible Research 3 - Git: 2 devs and a central repository Wojciech Hardy <!-- Put the link to this slide here so people can follow --> link: https://hackmd.io/@WHardy/RR25-git2 ![](https://i.imgur.com/ERha6aj.jpg) --- ### How does it work? (quick recap) ![](https://i.imgur.com/kAhvtxk.png) ---- ![](https://i.imgur.com/iVMN1GJ.png) ---- ![](https://i.imgur.com/pS0xho2.png) ---- ![](https://i.imgur.com/kKNRl5G.png) ---- ![](https://i.imgur.com/mxfFc2u.png) ---- ![](https://i.imgur.com/5d8IaOC.png) ---- ![](https://i.imgur.com/ZGIbDg3.png) ---- ![](https://i.imgur.com/rwBYE2S.png) ---- ![](https://i.imgur.com/nF9oH4d.png) ---- ![](https://i.imgur.com/M9uu5Rb.png) ---- ![](https://i.imgur.com/XXiNeOh.png) ---- ![](https://i.imgur.com/8F0idee.png) ---- ![](https://i.imgur.com/kj699fl.png) --- ## Cheatsheet: Basic commands ![](https://i.imgur.com/AgWDtav.png) ---- ## Cheatsheet: Advanced commands ![](https://i.imgur.com/g25VecZ.png) ---- ### Useful links [Read more on `git reset`](https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified) [Other cheat sheet 1 (Atlassian)](https://www.atlassian.com/git/tutorials/atlassian-git-cheatsheet) --- ## Git commands: working with a central repository <!-- .slide: style="font-size: 24px;" --> **`git init --bare`** to create barebones for a central repository (with no initial commits) **`git clone [repo_name] [clone_name]`** to create a linked copy of the **`repo_name`** repository. **`git fetch`** grab information about new commits/branches from the central repository. **`git pull`** to grab the (new) commits from the central repository to our repository. **`git push`** to put our (newly created) commits in the central repository. We're going to pretend we have two developers and a central repository. --- ## Quick recap 1. In our workspace, let's create a new folder RR_git2 and go inside 2. Let's create a repository named RecapRepo and go inside 3. Change local user.name to "RecapRepoUser" ---- 4. Create three files: commit the first; only stage the second; do nothing to the third ---- 5. In RR_git2 create a clone of the first repository; go inside 6. View the contents; check the status 6. View the `config` file in the `.git` folder. (e.g. in notepad) --- ## Exercise 5: simulating central repo with two locals We're now going to pretend we have two people collaborating, using a central repository to manage the workflow. 1. In your RR_git2 directory create a new, **bare** repository called "CentralRepo" (Remember to use the appropriate option when initiating the repository!) `cd RR_git2` `git init --bare CentralRepo` ---- 2. In your RR_git2 directory create a clone of the CentralRepo, named Dev1 `git clone CentralRepo Dev1` ---- 3. In your RR_git2 directory create a clone of the CentralRepo, named Dev2 `git clone CentralRepo Dev2` ---- 4. Set the local **`user.name`** for Dev1 repository to "Developer_1" `cd Dev1` `git config --local user.name "Developer_1"` ---- 5. Set the local **`user.name`** for Dev2 repository to "Developer_2" `cd ../Dev2` `git config --local user.name "Developer_2"` We'll be imitating this: ![](https://i.imgur.com/8F0idee.png) --- ## So far all repositories are empty. Let's imagine: 1. Dev1 kick-starts the project by creating the branch with one commit and sending it `upstream` `echo "This will be the file with code" > code.R` `git add .` `git commit -m "Added the file with code"` `git status` `git push` `git status` 2. Dev2 wants to get up-to-speed so grabs the changes `git pull` --- ## Exercise 6: fetching and updating before pushing <!-- .slide: style="font-size: 24px;" --> As you go, try to remember what are the states of the Dev1, the Dev2 and the Central Repositories at each step. (You can even draw them) 1. Create a readme.txt file in your Dev1 repository. `cd ../Dev1` `touch readme.txt` ---- 2. Stage, commit and push the file. `git add .` `git commit -m "Added readme.txt"` `git push` ---- 3. Go to the Dev2 repository. `cd ../Dev2` ---- 4. Run `git status` `git status` ---- 5. Fetch information about changes from the central repository. Run **`git status`**. `git fetch` `git status` ---- 6. Pull the information. Check folder contents. `git pull` `ls` ---- 7. Add a new line to readme.txt and create a readme.md file. `echo "second line of text" >> readme.txt` `touch readme.md` ---- 8. Stage, commit and push the file to the central repository. `git add .` `git commit -m "Added readme.md and changed readme.txt"` `git push` ---- 9. In Dev1, create a text3.txt file with the line "A line added by Dev1". Stage, commit and push - what happens? Resolve the issue following the hints. `cd ../Dev1` `echo "A line added by Dev1" > text3.txt` `git add .` `git commit -m "Added text3"` `git push` Follow the instructions from Git to resolve merge conflicts. --- ## Exercise 7: a merge conflict <!-- .slide: style="font-size: 24px;" --> In Exercise 6 we had a divergence, but without a conflict (commits differed, but there were no conflicting changes to files). What if two devs make two different versions of a file? 1. In Dev2, create a new file called text3.txt with the line "A line added by Dev2". Stage, commit and try to push. Read the hints, follow and go to step 2. ---- 2. There's a conflict because Dev1 committed a different text3.txt file earlier. We're in a merging mode. We can edit the file (e.g. in Notepad) to figure out what should remain. Then stage it and commit it. The merge becomes a new commit (try **`git log`**) --- ## Assignment While still in your Dev2 repository, run these three commands: `git status` > git2_a.txt `git log` >> git2_a.txt `git ls-files` >> git2_a.txt Send me the notepad file git2_a.txt (wojciechhardy@uw.edu.pl). --- ## Stuck in VIM? If you forgot about adding a message to your commit, you might have ended up in VIM. It's a free, text-editting software that sometimes feels like a trap. *Tl;dr:* hit [ESC], then type **`:q`* * and press **`Enter`** . Repeat your commit with a helpful description. You can also try adding the comment in VIM instead, and then exit with **`:wq`** instead, which should do the commit with the comment. See more in this [helpful Stackoverflow answer](https://stackoverflow.com/a/11828573). --- ## Useful links [Read more on the three trees with the **`git reset`** guideline](https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified) [Cheat sheet 1 (Atlassian)](https://www.atlassian.com/git/tutorials/atlassian-git-cheatsheet) [Git-scm in general](https://git-scm.com) [Atlassian in general](https://www.atlassian.com/git) If you need more, just Google tutorials/blog posts/YouTube videos until you find one that makes it clear :) Lots to choose from! ---
{"title":"Reproducible Research 3 - Git","slideOptions":"{\"theme\":\"night\"}","description":"Wojciech Hardy","contributors":"[{\"id\":\"1c10bb23-6c4c-4c1b-8586-5f8d56305139\",\"add\":6997,\"del\":0}]"}
    316 views