Story points | 1 |
Tags | git |
Hard Prerequisites |
|
This little exercise will take you through the basic git mechanisms you need to know about in order to be productive. By the end of this exercise you’ll be able to create and manage your own git repos.
IMPORTANT Make sure you go through the prerequisites listed above. Otherwise you’ll be clueless!
By the end of this you are expected to know:
When you are finished with these excercises come re-read this section and make sure you know what all these things mean.
Note: you can do all of this stuff from the command line! You should be using linux. Open up a terminal and do the following:
git-basic-exercises
ls -a
. It should be emptygit init
. Then check ls -a
again. Can you spot the difference?git status
touch README.md
. This creates a new blank file. Then check ls -a
and git status
again.git log
. The output should make sense to yougit add
commandgit status
again. Can you see the difference?git status
againgit commit -m "initial commit"
Your output should be something like this: [master (root-commit) 2103b64] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
git log
isn’t that nice? press q
to exitnano README.md
. This will open up a text editor. Type in some stuff and then press ctrl x
to exit. Then y
then enter
. This will save your changescat README.md
. This will print your file to the consolegit stats
again and make sure you understand it"second commit"
"third commit"
git log
. You should see all your commits there. It should look something like this:commit a57585d3cf93e64c04e62e58dfe8151d191503cf (HEAD -> master)
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:40 2019 +0200
third commit
commit a48c005c761902395cf9a50f13ddbffeee4f5537
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:12 2019 +0200
second commit
commit 2103b6418ecf4f70effabb639cfad6ac9d57c089
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 14:43:51 2019 +0200
initial commit
Each commit has a “hash”. That’s the weird alphanumeric string thingy, eg 2103b6418ecf4f70effabb639cfad6ac9d57c089
.
git checkout
and then paste in the commit hash and press entercat README.md
It’s like going back in time…git checkout master
cat README.md
Now we are up to dateYou can jump to any commit using git checkout
. You can checkout a branch, a commit hash, or a tag. We didn’t explore tags here.
When you checkout a branch, you checkout the latest commit on that branch.
Why would you want to do this? Well, it’s very useful to be able to go back and look at an old version of your code. Maybe you made a mistake and there is a bug and you want to go back to when there was no bug.
The real power of git is in branching. Branching is what allows big teams of developers to work on the same code base. Basiclly differnt developers make branches for different things and then those branches can be merged together into one mighty application.
Please Note At some point during this excercise you’ll get an error message! It’ll say something about a merge conflict. DONT PANIC! Merge conflicts are a fact of life and you’ll need to figure out how to fix it. (This)[https://opensource.com/article/20/4/git-merge-conflict] should help.
Let’s explore branching a little bit.
git branch
This lists all your branches. Git makes a branch named master
by defaultmilkshake-flavours
. git is not too restrictive when it comes to naming our branches. It’s generally best to choose a name that has something to do with what the branch is for. Our branch is about milkshakesgit branch
. Notice the little *
.git branch
again and look at the *
. Can you see what it means? Try switching between the different branches and see how hings change.milkshake-flavours
branch then type in nano milkshakes.md
and write fill in a few flavours. Mmmm. save and exitgit status
tell you?"added initial flavours"
history
and check it out. If you say git log
it should only have three commits. And if you use git branch
you should see 3 branches! This is important!history > history.txt
. Can you guess what it does?"added history"
. Take a look at the git log
git log
. it should have your three master commits and your one milkshake commit"random readme changes"
history
again and cat README.md
rm README.md
echo "booya" > README.md
You should know what these lines do.
"rewrote readme"
If you have followed along up until this point then your branches should look like this:
Type in:
git checkout master
ls
this outputs:
README.md
Check the log:
git log
this outputs something like:
commit a57585d3cf93e64c04e62e58dfe8151d191503cf (HEAD -> master)
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:40 2019 +0200
third commit
commit a48c005c761902395cf9a50f13ddbffeee4f5537
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:12 2019 +0200
second commit
commit 2103b6418ecf4f70effabb639cfad6ac9d57c089
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 14:43:51 2019 +0200
initial commit
Now lets look at milkshake-flavours:
git checkout milkshake-flavours
ls
You will see two files:
milkshakes.md README.md
And git log
will look like:
commit d2559d9758f3ec0f7928f6cbef705c6fa9679edf (HEAD -> milkshake-flavours)
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:25:07 2019 +0200
added initial flavours
commit a57585d3cf93e64c04e62e58dfe8151d191503cf (master)
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:40 2019 +0200
third commit
commit a48c005c761902395cf9a50f13ddbffeee4f5537
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:12 2019 +0200
second commit
commit 2103b6418ecf4f70effabb639cfad6ac9d57c089
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 14:43:51 2019 +0200
initial commit
Finally history:
git checkout history
ls
there should be two files:
history.txt README.md
and git log
outputs
commit 34025ac2b26accb7c5c18ec048a4982d3bae8909 (HEAD -> history)
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:38:05 2019 +0200
rewrote readme
commit b9e3c50fb65c7b2df0f09b921a15a7fc146e0bfb
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:36:04 2019 +0200
added history
commit a57585d3cf93e64c04e62e58dfe8151d191503cf (master)
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:40 2019 +0200
third commit
commit a48c005c761902395cf9a50f13ddbffeee4f5537
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 15:07:12 2019 +0200
second commit
commit 2103b6418ecf4f70effabb639cfad6ac9d57c089
Author: Sheena O'Connell <sheena.oconnell@gmail.com>
Date: Tue Apr 23 14:43:51 2019 +0200
initial commit
Now we want to get the master up to date with all out changes. Let’s start with the milkshake branch
git checkout master
git merge milkshake-flavours
ls
and git log
to see what this didls
and git log
to see what this did
As you can see a whole lot of changes have been made to the master branchgit checkout history
git log
...
git checkout milkshake-flavours
git log
These branches were not effected by the merge!
In general if we want to merge branch X into branch Y:
git checkout Y
git merge X
This adds a commit to branch Y and doesn’t change branch X
history
. Use git log
to see whats up.Go to Github.com (using your browser of choice) and create a new public repository using the user interface. Name it git-basic-exercises
You will see a bunch of weird looking things. There is a section entitled “…or push an existing repository from the command line”. We have an existing repository and a command line. So this seems appropriate. Copy the commands from there and paste them into your terminal. this will push your changes to github.
Refresh your browser. Cool eh? The url you are looking at should look like this: https://github.com/[YOUR_USERNAME]/git-basic-exercises
Now you should see a little dropdown box on github that says “Branch: master”. Click there. your other branches aren’t available.
A cool trick we use all the time: the network page!:
If your repo is available at https://github.com/[YOUR_USERNAME]/git-basic-exercises then take a look at https://github.com/[YOUR_USERNAME]/git-basic-exercises/network. I just added /network
on the end there. You’ll be able to see all the individual commits and all the different branches you’ve made and how they relate to each other.
Go look at your network page. each of the dots there represent commits you made. Can you see how they relate to what you did? Can you see the individual branches?
git-basic-exercises
directory. Let’s get out of there. cd ../
git clone $THE_URL_YOU_JUST_COPIED
. It should look something like this: git clone https://github.com/Umuzi-org/tech-department
cd
into the tech-department directory that was just createdgit branch
and git log
git branch -a
. This shows the remote branchesproject/git-basic-exercises
on your local computer. You can do it, you’ll need to figure out howgit remote -v
project/git-basic-exercises
use git log
to see the history.project/git-basic-exercises
navigate back to your git-basic-exercises
repo, use git log
again to see the difference.cd
and make a new folder mkdir this-will-be-another-repo
git init
to initilise a new git repo here, you should get a message in terminal that says ‘Initialized empty Git repository in /home/\$specific-path/this-will-be-another-repo/.git/’touch README.md
. This creates a new blank file. Stage then commit.git-basic-exercises
repo and use git log
to check that you are in the right place and repo.touch ignore-me.db
git status
to see what is going on in your repo, you will see ignore-me.bd as an unstaged file.nano .gitignore
ignore-me.db
save and exit your .gitignore filegit status
you will notice that ignore-me.db
is no longer an unstaged file and is no longer being tracked by github and .gitignore is being tracked.mkdir large-directory-that-should-be-local-only
cd
into this directory and create a readme.md file with some random text incd ..
to go back to your main directory and git status
to see what is going on, you should now see your new folder as an unstaged change.nano .gitignore
and add /large-directory-that-should-be-local-only
on a new line, save and close .gitignoregit status
again, .gitignore is going to be super useful later when you are submitting projects and need to keep your repos small and free from junk and irrelevant files.You should always gitignore the items in the below list:
Your repo should be all of the following:
We just covered the basics here. Please make sure you understand this stuff. It’s super important. Git might seem like a weird theoretical thing to a lot of you. It might seem completely unrelated to the actual job of writing code. But it’s not. Git makes teamwork on dev teams possible. Without it we’d spend more time shouting at each other than writing useful code. So learn it. Be comfortable with it. When we start working in teams later on all will be made clear.
If you are curious now, spend some time googling git branching strategies. We use the feature branching strategy here. We’ll cover it in depth later on in the course.