Work Locally with Git from the Command Line (Activity)
Title |
Work Locally with Git from the Command Line |
---|---|
Overview |
Students install and use git from the command line while answering questions about what each command does. See Interactive Visualization with Git for the next in the series. |
Prerequisites |
|
Learning Objectives |
After successfully completing this activity, the learner should be able to:
|
Process Skills Practiced |
Background
Is there background reading material?
- Students can reference http://git-scm.com/doc , though the answers can be found all around the web
Are there other activities the student should have done first?
- Students may want to understand what SCM is, and why it's important via Intro to GitHub (Activity)
What is the rational for this activity?
- All CS students should be familiar with Git and distributed SCM tools because they allow teams of developers to work together on a single project, at the same time, without stepping on each others' toes. It also forms the basis of most free open source software projects, which have distributed teams of developers that work on various forks and branches of projects. Other SCM solutions (subversion / SVN) cannot handle these scenarios well. Finally, the social and public aspects of coding evidenced by the likes of GitHub are important for students looking to prove their abilities and experience.
Directions
Install Git
Download and install git for your operating system:
- Windows: http://msysgit.github.io/
- Mac OSX or Linux: http://git-scm.com/
Setup SSH
You might want to setup an SSH key if you plan to work with remote repositories a lot.
See https://help.github.com/articles/generating-ssh-keys
Help Yourself
Open a terminal (git-bash on Windows) and run the following commands.
git help git help -ag git help init
- What does `git help` do?
- What does `-ag` cause `git help` to do?
- What does `git help command` do?
You may use `git help` at any time to help you answer the questions in this activity.
Identify yourself
Run the following commands, replacing BOGUS NAME and BOGUS@EMAIL with your name and email.
git config --global user.name 'BOGUS NAME' git config --global user.email 'BOGUS@EMAIL'
- What are these commands doing?
- What is the purpose of `--global`?
Create repository
mkdir project cd project git init
- What was created by `git init`?
- Any file that starts with `.` is hidden in Linux. How do you display a hidden file in Linux?
- What would happen if you delete `.git`?
- You find an old project on your hard drive. You do not remember if it is a under version control by git. How can you find out?
Basic commands
Use a plain text editor to create `names.txt` inside the `project` folder. Put the names of your team in the file. Save and exit.
Run `git status` before and after each of these commands.
git add names.txt git commit -m'Add our names.' git log
- What kind of information does `git status` report?
- What does `git add names.txt` do?
- What does `git commit -m'Add our names.'` do?
- What does `git log do`?
Use a plain text editor to create the following files:
- `birthdays.txt` - Put your birthdays in this file.
- `movies.txt` - Put the last movie each of you watched.
Run `git status` before and after each of these commands.
git add . git commit # You are in vim; write a multi-line commit message, save and quit. git log
- What does `git add .` do? What do you think `.` means?
- What does `git commit` (without -m) do?
- If you want to write a more detailed commit message (which is good practice) what command would you use?
Learn Staging / Tracking
Do the following:
- Modify `names.txt` so that names are listed in _Last, First_ format, one per line.
- Modify `movies.txt` so they are in reverse alphabetical order by title.
- Create a new file `foods.txt` that contains your favorite foods (one for each team member).
Run the following commands:
git add names.txt git status
- Below write each file name under the state that its changes are currently in. Compose a definition for each state.
- Staged
- Unstaged
- Untracked
- If you run `git commit` what changes will be committed (___don't do it___)?
- What command do you run to stage changes?
- What command do you run to unstage changes?
Run the following commands:
git diff git diff --cached
- What does `git diff` display?
- What does `git diff --cached` display?
- Formulate a sequence of commands to unstage changes to `names.txt`, and stage the changes to `movies.txt`. Execute your commands and confirm they worked.
- Edit `movies.txt`, change any one of the movies, and save it. Then run `git status`. What do you observe? Explain what you think is going on.
- Delete `names.txt`. Then run `git status`. What do you observe? Explain what you think is going on.
- Rename `movies.txt` to `last-movies`. Run `git status`. Observe and explain.
- Formulate a sequence of commands to stage all changes including the untracked file and commit (with any reasonable message you like). Execute them.
- In git vernacular, `index`, `cache`, and `stage` all refer to the same thing. What does it hold?
- Why have a `stage`? Why not just commit all changes since the last commit?
How to Undo
git log git status git reset --soft HEAD^ git log git status
- What does `git reset --soft HEAD^` do?
git commit -m'Redo' git log git status git reset --hard HEAD^ git log git status
- What does `git reset --hard HEAD^` do?
- What is the difference between `--hard` and `--soft`?
- What do you think `HEAD^` means?
- What do you think `HEAD` means?
Deliverables
Please hand in your answers to all questions in the Directions.
Bonus points for those who type their answers up and link to them on a public git repository!
Assessment
Criteria | Level 1 (fail) | Level 2 (pass) | Level 3 (good) | Level 4 (exceptional) |
# of Answers | 20 of 36 | 26 of 36 | 30 of 36 | 36 of 36 |
Correct usage | Used incorrect commands | Some correct commands with lazy comments | Mostly Correct commands, occasional comments | All Correct commands with contextual comments |
Answers on public git (extra points) | No answers on public git | Some answers on public git, but linked incorrectly | All answers on public git, but uses only one large commit | All answers on public git, and multiple well-commented commits |
Comments
ACM BoK Area & Unit(s) |
SE - Software Engineering / SE Tools and Environments |
---|---|
ACM BoK Topic(s) |
Software configuration management and version control |
Difficulty |
Easy |
Estimated Time to Complete |
60-90 minutes |
Environment / Materials |
|
Author(s) |
Stoney Jackson, Nick Yeates |
Source | |
License |
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License |
Suggestions to Open Source Mentors:
Suggestions for an open source community member who is working in conjunction with the instructor.
- Explain to students what SCM tool they use. If it is not git, explain how it differs.
- The mentor might explain to student what general process or "order of operations" they use when committing code to their project.