diff --git a/content/backups-jupyterlab/_index.md b/content/backups-jupyterlab/_index.md new file mode 100644 index 0000000..00afa86 --- /dev/null +++ b/content/backups-jupyterlab/_index.md @@ -0,0 +1,277 @@ +--- +draft: false +title: "Backing up repositories" +--- + +# Introduction + +In this tutorial, we'll learn how to back up the repo we made in the [solo workflow tutorial](../solo-jupyterlab) to the cloud. This backup will _include_ the file change histories. Because that backup lives in the cloud, you can technically download it to multiple computers (or multiple locations on your current computer). We'll also learn how to keep the timelines consistent across all of those copies, in case we add content to one of them. + +# Making a GitHub account + +{{% aside %}} +✋ If you already have a GitHub account, you can [skip this section](#acct-end) +{{% /aside %}} + +Follow this link to create a new GitHub account: + +{{% aside %}} +🔗 https://github.com/signup +{{% /aside %}} + + + +# Setting up account credentials + + +Click your user icon in the top right: +![](./img/github-menu.png) + +Choose settings: +![](./img/github-settings.png) + +Choose `SSH and GPG Keys` from the menu on the left (1): + +![](./img/github-new-key.png) + +{{% aside %}} +✋ If you already have SSH keys listed on this page in your GitHub account, you can [skip the remainder of this section](#key-end) +{{% /aside %}} + +Click the green `New SSH Key` button (2), and then go back to your JupyterHub window. + +Click the + button (1) and then open a new Terminal (2): + +![](./img/new-term.png) + +From the terminal, run the following command: + +```bash +ssh-keygen +``` + +Hit the enter key to accept the default values for the questions the tool asks you. **Do not specify a passphrase!!** Just leave it blank :) . + +This process will generate an **SSH key**, which is like a super-powered password that comes in two parts: a _private_ key and a _public_ key. You'll share the public key with GitHub. Run this command, which prints the contents of your public key to the terminal: + +```bash +cat ~/.ssh/id_rsa.pub +``` + +It'll look...well..._incomprehensible_. That's a good thing! We'll never be typing it in ourselves. Select and copy all of the command output (starting with the text `ssh-rsa` and extending all the way down to the blank line). + +Now, go back to your web browser that was open to GitHub's "Add SSH Key" page and paste the contents into the "Key" box. Give the key indicating which computer you generated it on, and click the green "Add" button: + +![](./img/github-new-key-2.png) + +Now to test that everything works, go back to your terminal and run the following command: + +```bash +ssh -T git@github.com +``` + +If you see a warning printed like the text below, just type `yes` and hit enter to continue: + +```plaintext +The authenticity of host 'github.com (IP ADDRESS)' can't be established. +ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU. +Are you sure you want to continue connecting (yes/no)? +``` + +Regardless, if things were successful, you'll see a message like this: + +```plaintext +Hi [USERNAME]! You've successfully authenticated, +but GitHub does not provide shell access. +``` + +If you _don't_ see that message, ask for help before you move on. + +{{% aside %}} +ℹ️ In general, we need to repeat this process on any new computer we're using to connect to Github. You can add as many SSH keys as you want to your account. +{{% /aside %}} + + + +# Connecting our JupyterHub repo to our GitHub account + +We need to start by making an empty repository on GitHub's website, which we'll soon fill with all of our work from the solo workflow. + +From anywhere on GitHub's website, click the plus button at the top-right (1) and select 'New Repository' (2): + +![](./img/github-new-repo.png) + +From here, you'll be able to select some options for how your repository will be stored. Make the following choices: + +- (1) Give the repo the same name as the folder you made in the solo workflow. The two don't _have_ to have the same name, but if they don't it's easy to lose track of which folder on your computer is connected to this cloud backup. +- (2) Select _Private_ for the repo's visibiltiy. This controls whether the cloud version of the repository will be visible to everyone on the internet, or _just_ to yourself (and any GitHub users you explicitly choose). +- Leave everything else on the page exactly the same + +Scroll down and click the green "Create" button: + +![](./img/github-new-repo-2.png) + +You'll be brought to your new repository's **landing page**: + +![](./img/github-blank-repo.png) + +Now we need to connect our computer's repository (the "local" copy) with this repository (the "remote" copy). This process is called "**adding a remote**". Start by copying the SSH url of the repository on the landing page, as circled on the right below: + +![](./img/ssh-url.png) + +The thing you're copying should start with the text `git@github.com`. If it doesn't, try clicking the `SSH` button as circled on the left first, and then copying the text. + +Now let's go back to JupyterHub. Open the Git menu at the top (1) and select "Manage Remote Repositories" (2): + +![](./img/manage-remote.png) + + +Enter the name "**origin**" (1), which by convention is the name we use for the primary copy of our repo that lives in the cloud. Then, in the next box, paste in the text we copied from GitHub (2). Click Add (3): +![](./img/manage-remote-2.png) + +The remote should appear in the list below the Add button. Click the `X` on the "Manage Remotes" window to return to our workspace. + +Finally, open the git menu again and click "Push to remote": + +![](./img/push-1.png) + +After a minute, we should see a success message show up in the bottom right of the window. Go back to your repo's landing page on GitHub, and refresh the page. You should see your files there! + +![](./img/repo-on-web.png) + +Congratulations, your hard work is backed up to the cloud 🙂 . + +# Keeping things synced + +Let's open up the `readme.txt` on our JupyterHub and add another fact about ourselves to the bottom: + +```plaintext +Celebrity Crush: Katya Zamolodchikova +``` + +Commit this change to the repo in JupyterHub and go back to the remote repo on GitHub. Refresh the page: + +![](./img/repo-on-web.png) + +...the change didn't show up. It turns out different copies of the repository don't stay in sync automatically. We always have to manually choose to sync them. + +{{% aside %}} + +**⚠️⚠️This is an important point⚠️⚠️⚠️** + +It's so important, let's repeat it: Changes we make on our local repo won't be reflected on the remote copy until we _push_ them to that copy. + +{{% /aside %}} + +This is behavior is really useful! If we screw something up on our local repository, it won't automatically screw up the cloud backup. We could just delete the folder from our computer and download the whole thing again from Git (we'll do that soon in the collaborative workflow). + +Anyway, let's push our local changes. Click the push button (the up arrow) in the top of the Git sidebar: + +![](./img/push-2.png) + +Now go back to GitHub and refresh the page. We should now see our recent changes appear: + +![](./img/synced-web.png) + +But wait, what if we change something on the _GitHub_ copy? (...can we do that?) + +We might have noticed that the preview text in the README isn't formatted nicely. If we add an extra blank line between each fact about ourselves, things should look nicer. Click the little pencil icon on the top-right of the README box: + +![](./img/github-edit.png) + +Add an extra blank line between each of our facts, and then click `Commit changes...` (2): + +![](./img/repo-web-edit.png) + +GitHub will ask you for a commit message. Enter something in the description box, leave the rest of the settings as-is and click the green "Commit" button: + +![](./img/web-commit-msg.png) + +Go back to the repo's landing page with the `<> Code` button at the top: + +![](./img/landing-button.png) + +We'll see our latest commit reflect on the landing page, and the formatting should be corrected. But now let's go back to JupyterHub. Things are just as we left them before our GitHub edits: + +![](./img/local-crush.png) + +To get those changes on our local repo, we have to **pull** them (the opposite of a push!). Click the button with the _down_ arrow (the pull button), right next to the push button we've already used: + +![](./img/pull-button.png) + +We'll see our new commits appear in the timeline: + +![](./img/new-commit-local.png) + +# What if we change something on both GitHub _and_ locally? + +This is beginning to get into where Git both shines as a power tool and also gets _difficult_ to use. Let's jump into it together. + +Before we get started, let's set a Git option regarding how to deal with conflicting changes. We'll only have to do this once. Open a terminal using the Git menu and selecting "Open Git Repository in Terminal". In the terminal that opens, run this command. It should complete without presenting any output: + +```bash +git config pull.rebase false +``` + +Now make a commit on GitHub changing `readme.txt`, and make a _different_ change/commit to local `readme.txt`. Add your favorite color to `readme.txt` using GitHub, and add the name of the most recent book you read on JupyterHub. Make sure to commit the changes in both places. + +![](./img/two-commits.png) + +Then click the "pull" button in JupyterHub. An error will appear in the bottom right explaining that the pull failed, and looking in the "Changes" tab we'll see that README.md now appears in the _Conflicted_ list! + +![](./img/conflict-1.png) + +So, what happened? + +We can get a visualization by running a complicated-looking terminal command whose sole job is just to print a little picture of our commit history. Open a new terminal by clicking the Git menu and selecting "Open Git Repository in Terminal," and then run this: + +```bash +git log --all --decorate --oneline --graph +``` + +We'll see a crude drawing of a timeline printed out to the screen that looks like this: + +![](./img/diverge.png) + +Look at the top where the red lines appear. This is telling us that the repo's main timeline has _diverged_ into two branches 😱🙀🤯 + +On the one hand, we have our "normal" `master` branch showing the commit we made through Sublime Merge (adding the book we read). On the other branch, labeled `origin/master`, we have the commit from GitHub (adding our favorite color). + +Sometimes Git can figure out how to resolve these discrepancies and merge the timelines, but it often runs into situations where it would rather ask _you_ to do so manually (so it doesn't accidentally make changes you'd disagree with). In this case, Git is asking us about that file in the "Conflicts" list we saw earlier. + +This is a common problem to encounter, and very worth our while to get experience dealing with! Whenever we encounter a conflict, we need to open the conflicted file in a text editor and _fix_ the conflicted portions of it. Those portions are labelled with a specific notation: + +```python +<<<<<<< VERSION 1 LABEL +version 1 of the conflicting text +======= +version 2 of the conflicting text +>>>>>>> VERSION 2 LABEL +``` + +Wherever these angle brackets `<<<<<<< ... >>>>>>>` appear, they indicate two different versions of the same section of text, separated by the `=======`. Git couldn't choose between them, so it wants us to replace this conflicting section, including the angle brackets `<<<<<<< ... >>>>>>>`, with the version _we_ want. Maybe this is the top version. Maybe it's the bottom. Maybe it's some clever combination of the two. + +So let's open up `README.md` and take a look. Open the Files tab (1) and select README.md (2). We should see a conflict at the bottom (3): + +![](./img/confused.png) + +The way Git sees it: in two parallel universes, we edited our file and added a fact to the end. In one univese, it was a book name. In the other, it was a favorite color. Git doesn't know which version of events we would choose as the authoritative one. Actually, we choose neither -- we want a universe in which we added _both_ facts to the bottom of the file. So, let's replace the `<<<<<<< ... >>>>>>>` brackets and everything between them with the lines we want to keep: + +![](./img/resolve-2.png) + +Save the file, then open up the Git sidebar (1). Double-click the conflicted file we just fixed (2), and click "Mark as resolved" (3): + +![](./img/resolve-conflict-final.png) + +You'll see the file move from "Conflicted" to "Staged" in the sidebar. Git would like to memorialize our resolution of the timeline with a commit that unifies the two branches. This is called a _branch merge_. Seal the deal by writing a commit message and hitting the commit button. + +If you go back to the terminal and run that branch viewer command again, you should see a drawing of a timeline that splits into two branches and then merges again. Time crisis averted. Hooray! + +![](./img/merged-local.png) + +At this point, the timelines have been resolved on your local repo, but the remote copy is still lacking your local changes. Click the "push" button to push your changes to GitHub: + +![](./img/merged-remote.png) + +Congratulations, you just dealt with the most common difficult problem you'll encounter while using Git. Hopefully that wasn't so bad! Regardless, you will be come more comfortable with it with practice 🙂. + diff --git a/content/backups-jupyterlab/img/conflict-1.png b/content/backups-jupyterlab/img/conflict-1.png new file mode 100644 index 0000000..cfe64d2 Binary files /dev/null and b/content/backups-jupyterlab/img/conflict-1.png differ diff --git a/content/backups-jupyterlab/img/confused.png b/content/backups-jupyterlab/img/confused.png new file mode 100644 index 0000000..f5911d2 Binary files /dev/null and b/content/backups-jupyterlab/img/confused.png differ diff --git a/content/backups-jupyterlab/img/diverge.png b/content/backups-jupyterlab/img/diverge.png new file mode 100644 index 0000000..b9a3617 Binary files /dev/null and b/content/backups-jupyterlab/img/diverge.png differ diff --git a/content/backups-jupyterlab/img/github-blank-repo.png b/content/backups-jupyterlab/img/github-blank-repo.png new file mode 100644 index 0000000..c0cfd44 Binary files /dev/null and b/content/backups-jupyterlab/img/github-blank-repo.png differ diff --git a/content/backups-jupyterlab/img/github-edit.png b/content/backups-jupyterlab/img/github-edit.png new file mode 100644 index 0000000..c27051d Binary files /dev/null and b/content/backups-jupyterlab/img/github-edit.png differ diff --git a/content/backups-jupyterlab/img/github-menu.png b/content/backups-jupyterlab/img/github-menu.png new file mode 100644 index 0000000..c3ddd67 Binary files /dev/null and b/content/backups-jupyterlab/img/github-menu.png differ diff --git a/content/backups-jupyterlab/img/github-new-key-2.png b/content/backups-jupyterlab/img/github-new-key-2.png new file mode 100644 index 0000000..491367b Binary files /dev/null and b/content/backups-jupyterlab/img/github-new-key-2.png differ diff --git a/content/backups-jupyterlab/img/github-new-key.png b/content/backups-jupyterlab/img/github-new-key.png new file mode 100644 index 0000000..d8bd2f7 Binary files /dev/null and b/content/backups-jupyterlab/img/github-new-key.png differ diff --git a/content/backups-jupyterlab/img/github-new-repo-2.png b/content/backups-jupyterlab/img/github-new-repo-2.png new file mode 100644 index 0000000..2f43fcb Binary files /dev/null and b/content/backups-jupyterlab/img/github-new-repo-2.png differ diff --git a/content/backups-jupyterlab/img/github-new-repo.png b/content/backups-jupyterlab/img/github-new-repo.png new file mode 100644 index 0000000..3ec2218 Binary files /dev/null and b/content/backups-jupyterlab/img/github-new-repo.png differ diff --git a/content/backups-jupyterlab/img/github-settings.png b/content/backups-jupyterlab/img/github-settings.png new file mode 100644 index 0000000..d2a877c Binary files /dev/null and b/content/backups-jupyterlab/img/github-settings.png differ diff --git a/content/backups-jupyterlab/img/landing-button.png b/content/backups-jupyterlab/img/landing-button.png new file mode 100644 index 0000000..5752f9a Binary files /dev/null and b/content/backups-jupyterlab/img/landing-button.png differ diff --git a/content/backups-jupyterlab/img/local-crush.png b/content/backups-jupyterlab/img/local-crush.png new file mode 100644 index 0000000..1746421 Binary files /dev/null and b/content/backups-jupyterlab/img/local-crush.png differ diff --git a/content/backups-jupyterlab/img/manage-remote-2.png b/content/backups-jupyterlab/img/manage-remote-2.png new file mode 100644 index 0000000..6acf277 Binary files /dev/null and b/content/backups-jupyterlab/img/manage-remote-2.png differ diff --git a/content/backups-jupyterlab/img/manage-remote.png b/content/backups-jupyterlab/img/manage-remote.png new file mode 100644 index 0000000..d7aeaba Binary files /dev/null and b/content/backups-jupyterlab/img/manage-remote.png differ diff --git a/content/backups-jupyterlab/img/merged-local.png b/content/backups-jupyterlab/img/merged-local.png new file mode 100644 index 0000000..8c37bf6 Binary files /dev/null and b/content/backups-jupyterlab/img/merged-local.png differ diff --git a/content/backups-jupyterlab/img/merged-remote.png b/content/backups-jupyterlab/img/merged-remote.png new file mode 100644 index 0000000..5be0ffb Binary files /dev/null and b/content/backups-jupyterlab/img/merged-remote.png differ diff --git a/content/backups-jupyterlab/img/new-commit-local.png b/content/backups-jupyterlab/img/new-commit-local.png new file mode 100644 index 0000000..18bf301 Binary files /dev/null and b/content/backups-jupyterlab/img/new-commit-local.png differ diff --git a/content/backups-jupyterlab/img/new-term.png b/content/backups-jupyterlab/img/new-term.png new file mode 100644 index 0000000..43025cc Binary files /dev/null and b/content/backups-jupyterlab/img/new-term.png differ diff --git a/content/backups-jupyterlab/img/pull-button.png b/content/backups-jupyterlab/img/pull-button.png new file mode 100644 index 0000000..bc29636 Binary files /dev/null and b/content/backups-jupyterlab/img/pull-button.png differ diff --git a/content/backups-jupyterlab/img/push-1.png b/content/backups-jupyterlab/img/push-1.png new file mode 100644 index 0000000..0817146 Binary files /dev/null and b/content/backups-jupyterlab/img/push-1.png differ diff --git a/content/backups-jupyterlab/img/push-2.png b/content/backups-jupyterlab/img/push-2.png new file mode 100644 index 0000000..d3de17c Binary files /dev/null and b/content/backups-jupyterlab/img/push-2.png differ diff --git a/content/backups-jupyterlab/img/repo-on-web.png b/content/backups-jupyterlab/img/repo-on-web.png new file mode 100644 index 0000000..d4afad6 Binary files /dev/null and b/content/backups-jupyterlab/img/repo-on-web.png differ diff --git a/content/backups-jupyterlab/img/repo-web-edit.png b/content/backups-jupyterlab/img/repo-web-edit.png new file mode 100644 index 0000000..60eba3a Binary files /dev/null and b/content/backups-jupyterlab/img/repo-web-edit.png differ diff --git a/content/backups-jupyterlab/img/resolve-2.png b/content/backups-jupyterlab/img/resolve-2.png new file mode 100644 index 0000000..24092f9 Binary files /dev/null and b/content/backups-jupyterlab/img/resolve-2.png differ diff --git a/content/backups-jupyterlab/img/resolve-conflict-final.png b/content/backups-jupyterlab/img/resolve-conflict-final.png new file mode 100644 index 0000000..ab45092 Binary files /dev/null and b/content/backups-jupyterlab/img/resolve-conflict-final.png differ diff --git a/content/backups-jupyterlab/img/ssh-url.png b/content/backups-jupyterlab/img/ssh-url.png new file mode 100644 index 0000000..264f627 Binary files /dev/null and b/content/backups-jupyterlab/img/ssh-url.png differ diff --git a/content/backups-jupyterlab/img/synced-web.png b/content/backups-jupyterlab/img/synced-web.png new file mode 100644 index 0000000..12524dd Binary files /dev/null and b/content/backups-jupyterlab/img/synced-web.png differ diff --git a/content/backups-jupyterlab/img/two-commits.png b/content/backups-jupyterlab/img/two-commits.png new file mode 100644 index 0000000..9fa82d2 Binary files /dev/null and b/content/backups-jupyterlab/img/two-commits.png differ diff --git a/content/backups-jupyterlab/img/upstream.png b/content/backups-jupyterlab/img/upstream.png new file mode 100644 index 0000000..eea4d20 Binary files /dev/null and b/content/backups-jupyterlab/img/upstream.png differ diff --git a/content/backups-jupyterlab/img/web-commit-msg.png b/content/backups-jupyterlab/img/web-commit-msg.png new file mode 100644 index 0000000..38bfc20 Binary files /dev/null and b/content/backups-jupyterlab/img/web-commit-msg.png differ diff --git a/content/solo-jupyterlab/_index.md b/content/solo-jupyterlab/_index.md new file mode 100644 index 0000000..e6e27ce --- /dev/null +++ b/content/solo-jupyterlab/_index.md @@ -0,0 +1,128 @@ +--- +draft: false +title: "Solo Git Workflow" +--- + +# Introduction + +In this tutorial, we'll learn how to use Git to keep track of changes to text files over time. The steps presented here represent just _one_ way to use Git -- a **solo** workflow, in which the files live on your personal computer and are never intended to be shared with or edited by other people. + +# Setting up a lil journal + +Make a new folder in the home folder of your JupyterHub called `my-journal`, and inside it make a new text file called `README.md`. + +Type out some info about yourself, like this: + +```bash +Name: Naomi Alterman +Favorite Food: Pizza +Favorite Animal: Bunnies +``` + +Save that file as `README.md` in your `my-journal` folder. + +At this point our `my-journal` folder is just a normal file folder, with normal files. Let's turn it into a git repository so we can track changes to those files over time! + +# Turning our journal folder into a repository + +Open the Git tab on the side of the JupyterHub (1) and click New Repository (2). Confirm in the window pops up that, yes, we want to turn the folder into a repo: + +![](./img/git-init.png) + +The folder `my-journal` will now be turned into a git repo, and present a sidebar that looks like this: + +![](./img/changes.png) + +From here, we'll be able to see changes to files that haven't yet been committed to the Git timeline. By we'll collect those changes up on to the commit *stage*, and then *make the commit* to record them into the repo's history! + +# Making our first commit + +Let's make our first commit, in which we'll mark the initial version of our user profile. + +We'll start by **staging** the changes, which indicates to Git that we want to _include_ them in the next commit. Expand the list of "Untracked Files". Move your mouse over `README.md` and click the plus button `+` to stage the file to be tracked by Git: + +![](./img/track-readme.png) + +The file will move to the *Staged* list, indicating its changes are ready to be recorded in the historical timeline. Move your mouse over the file again and click the button with the `+/-` symbols on it to view the file's "diff": + +![](./img/diff-button.png) + + + Note how this displays the contents of the file in green: the "diff" view of the file shows the changes (the "_diff_"erences) since the last commit of the timeline. Since it's a new file, and this is our first commit, all of the file text is new and thus highlighted in green: + +![](./img/diff-view.png) + +Let's commit the changes now :) . In the bottom left of the window, enter a brief summary of the changes (1) and hit the blue COMMIT button (2): + +![](./img/commit-message.png) + +{{% aside %}} + +**ℹ️ Heads up!** + +The first time you do this, you may be asked to provide your name and email address to be noted in the commit log. If the repo was ever made publically available this personal info would be visible as well, so please keep this in mind (especially when entering an email address). You don't have to put your _actual_ information here if you don't want to. + +{{% /aside %}} + +Once you're finished, you'll see the readme file disappear entirely from this sidebar. That indicates that the readme has had no changes to its content since the last commit. + +That said, the information about file history is all still there! Click the History tab (1) to view all previous commits to the repository. Note the commit we just made is visible now (2). Click it to display what changes were recorded at that point in time. In this case, it's our README file (3). From here we can open a diff of the file, or see a summary about what was changed: + +![](./img/history-view.png) + +Also notice the gibberish numbers in the summary after the committer's name (circled below in red). This is called the **commit hash**: it's a string of letters and numbers that serve as a unique name for this commit (that is, this set of changes to our files). Git tools (and git users) will often use commit hashes as "names" for specific points in the timeline. Insetad of including _all_ of the hash, it's often sufficient to just include 6 or 7 characters from the beginning (left side) of the hash. For example, the selected commit in the screenshot could be referred to as `commit f5b16`. + +![](./img/hash.png) + +# Using commits to record changes + +Let's change our profile. Go over to your text file and make a few changes: +- Add a new line in the middle of the file and specify your favorite song. +- Replace your favorite animal's name with its taxonomic name (you may have to google it) + + +My profile now looks like this: + +```bash +Name: Naomi Alterman +Favorite Song: "Under Pressure" by Queen +Favorite Food: Pizza +Favorite Animal: Oryctolagus cuniculus +``` + +Save the file and then open the "Changes" tab on the git sidebar. Click the diff button on our README.md file to see your changes represented as a diff: + +![](./img/diff-changes.png) + +In the sidebar, click the '+' button next to README.md to stage the changes for commit. Then type a message out and commit the changes. Now we'll have two commits in our history: + +![](./img/two-commits.png) + +Let's make another commit! Make a new text file file in your journal folder and save it as `recipe.md`. Paste your favorite recipe into it: + +![](./img/recipe.png) + +Add a new line to `README.md` mentioning it: + +```plaintext +Name: Naomi Alterman +Favorite Song: "Under Pressure" by Queen +Favorite Food: Pizza +Favorite Animal: Oryctolagus cuniculus +Favorite Recipe: Oatmeal butterscotch cookies (see recipe.md for details) +``` + +Make sure to save all those files, and then return to the "Changes" tab of the git sidebar. Stage **both** the changes to your `README.md`, and also your new `recipe.md` file. Write a summary and commit! + +![](./img/third-commit.png) + +Now we have a journal folder containing our personal profile and our favorite recipe. We also have a timeline showing the development of that content over time. + +To view the difference between two commits that _aren't_ next to each other in time, click the right-arrow button on the earlier commit (1) and the left-arrow button on the later commit (2). This will give you a list of files that changed between those two points in time. Click the diff button for the `README.md` (3): + +![](./img/diff-big.png) + +This will show us how the file evolved from the earlier point to the later point: + +![](./img/diff-big-2.png) + diff --git a/content/solo-jupyterlab/img/changes.png b/content/solo-jupyterlab/img/changes.png new file mode 100644 index 0000000..99025cd Binary files /dev/null and b/content/solo-jupyterlab/img/changes.png differ diff --git a/content/solo-jupyterlab/img/commit-message.png b/content/solo-jupyterlab/img/commit-message.png new file mode 100644 index 0000000..9bc0abf Binary files /dev/null and b/content/solo-jupyterlab/img/commit-message.png differ diff --git a/content/solo-jupyterlab/img/diff-big-2.png b/content/solo-jupyterlab/img/diff-big-2.png new file mode 100644 index 0000000..ddbafa8 Binary files /dev/null and b/content/solo-jupyterlab/img/diff-big-2.png differ diff --git a/content/solo-jupyterlab/img/diff-big.png b/content/solo-jupyterlab/img/diff-big.png new file mode 100644 index 0000000..8614b00 Binary files /dev/null and b/content/solo-jupyterlab/img/diff-big.png differ diff --git a/content/solo-jupyterlab/img/diff-button.png b/content/solo-jupyterlab/img/diff-button.png new file mode 100644 index 0000000..2158d8d Binary files /dev/null and b/content/solo-jupyterlab/img/diff-button.png differ diff --git a/content/solo-jupyterlab/img/diff-changes.png b/content/solo-jupyterlab/img/diff-changes.png new file mode 100644 index 0000000..cc2aeac Binary files /dev/null and b/content/solo-jupyterlab/img/diff-changes.png differ diff --git a/content/solo-jupyterlab/img/diff-view.png b/content/solo-jupyterlab/img/diff-view.png new file mode 100644 index 0000000..8fecd08 Binary files /dev/null and b/content/solo-jupyterlab/img/diff-view.png differ diff --git a/content/solo-jupyterlab/img/git-init.png b/content/solo-jupyterlab/img/git-init.png new file mode 100644 index 0000000..356433b Binary files /dev/null and b/content/solo-jupyterlab/img/git-init.png differ diff --git a/content/solo-jupyterlab/img/hash.png b/content/solo-jupyterlab/img/hash.png new file mode 100644 index 0000000..c890379 Binary files /dev/null and b/content/solo-jupyterlab/img/hash.png differ diff --git a/content/solo-jupyterlab/img/history-view.png b/content/solo-jupyterlab/img/history-view.png new file mode 100644 index 0000000..01add8b Binary files /dev/null and b/content/solo-jupyterlab/img/history-view.png differ diff --git a/content/solo-jupyterlab/img/recipe.png b/content/solo-jupyterlab/img/recipe.png new file mode 100644 index 0000000..95f1301 Binary files /dev/null and b/content/solo-jupyterlab/img/recipe.png differ diff --git a/content/solo-jupyterlab/img/third-commit.png b/content/solo-jupyterlab/img/third-commit.png new file mode 100644 index 0000000..5ce247d Binary files /dev/null and b/content/solo-jupyterlab/img/third-commit.png differ diff --git a/content/solo-jupyterlab/img/track-readme.png b/content/solo-jupyterlab/img/track-readme.png new file mode 100644 index 0000000..b65b93c Binary files /dev/null and b/content/solo-jupyterlab/img/track-readme.png differ diff --git a/content/solo-jupyterlab/img/two-commits.png b/content/solo-jupyterlab/img/two-commits.png new file mode 100644 index 0000000..09d2832 Binary files /dev/null and b/content/solo-jupyterlab/img/two-commits.png differ