HW4, practice with Git¶
This assignment (one long question) reviews materials in lectures 6 and 7.
In all cases, programming should be done in python 3 and you should use any good programming practices that we have discussed so far (e.g. use of white space).
1. Git¶
i. After Wolfman initialized the repo planets
from the empty directory, Dracula wants to start tracking information about moons.¶
Despite Wolfman’s concerns, Dracula creates a moons
project inside
his planets
project with the following sequence of commands:
$ cd ~/Desktop # return to Desktop directory
$ cd planets # go into planets directory, which is already a Git repository
$ ls -a # ensure the .git sub-directory is still present in the planets directory
$ mkdir moons # make a sub-directory planets/moons
$ cd moons # go into moons sub-directory
$ git init # make the moons sub-directory a Git repository
$ ls -a # ensure the .git sub-directory is present indicating we have created a new Git repository
Is the git init
command, run inside the moons
sub-directory,
required for tracking files stored in the moons
sub-directory?
ii. Choosing a Commit Message¶
Which of the following commit messages would be most appropriate for the
commits made to mars.txt
in class?
- “Changes”
- “Added line ‘But the Mummy will appreciate the lack of humidity’ to mars.txt”
- “Discuss effects of Mars’ climate on the Mummy”
iii. Committing Changes to Git¶
Which command(s) below would save the changes of myfile.txt
to my
local Git repository?
$ git commit -m "my recent changes"
$ git init myfile.txt $ git commit -m "my recent changes"
$ git add myfile.txt $ git commit -m "my recent changes"
$ git commit -m myfile.txt "my recent changes"
iv. Committing Multiple Files¶
The staging area can hold changes from any number of files that you want to commit as a single snapshot.
- Add some text to
mars.txt
noting your decision to consider Venus as a base - Create a new file
venus.txt
with your initial thoughts about Venus as a base for you and your friends - Add changes from both files to the staging area, and commit those changes.
v. Creating a new repository¶
- Create a new Git repository on your computer called
bio
. - Write a three-line biography for yourself in a file called
me.txt
, commit your changes - Modify one line, add a fourth line
- Display the differences between its updated state and its original state.
vi. Recovering Older Versions of a File¶
Pilar has made changes to the Python script that she has been working on for weeks, and the modifications she made this morning “broke” the script and it no longer runs. She has spent ~ 1hr trying to fix it, with no luck…
Luckily, she has been keeping track of her project’s versions using Git!
Which commands below will let her recover the last committed version of
her Python script called data_cruncher.py
?
vii. Reverting a Commit¶
Pilar is collaborating on her Python script with her colleagues and
realizes her last commit to the group repository is wrong and wants to
undo it. Jennifer needs to undo correctly so everyone in the group
repository gets the correct change. git revert [wrong commit ID]
will make a new commit that undoes Jennifer’s previous wrong commit.
Therefore git revert
is different than git checkout [commit ID]
because checkout
is for local changes not committed to the group
repository. Below are the right steps and explanations for Jennifer to
use git revert
, what is the missing command?
________ # Look at the git history of the project to find the commit ID
- Copy the ID (the first few characters of the ID, e.g. 0g1d055).
git revert [commit ID]
- Type in the new commit message.
- Save and close
viii. Understanding Workflow and History¶
What is the output of the last command in
$ cd planets
$ echo "Venus is beautiful and full of love" > venus.txt
$ git add venus.txt
$ echo "Venus is too hot to be suitable as a base" >> venus.txt
$ git commit -m "Comment on Venus as an unsuitable base"
$ git checkout HEAD venus.txt
$ cat venus.txt #this will print the contents of venus.txt to the screen
ix. Getting Rid of Staged Changes¶
git checkout
can be used to restore a previous commit when unstaged
changes have been made, but will it also work for changes that have been
staged but not committed? Make a change to mars.txt
, add that
change, and use git checkout
to see if you can remove your change.
x. What does the following command do?¶
$ git log --patch HEAD~3 *.txt
xi. Ignoring Nested Files¶
Given a directory structure that looks like:
results/data
results/plots
How would you ignore only results/plots
and not results/data
?
xii. Including Specific Files¶
How would you ignore all .data
files in your root directory except
for final.data
? Hint: Find out what !
(the exclamation point
operator) does
xiii. Ignoring all data Files in a Directory¶
Given a directory structure that looks like:
results/data/position/gps/a.data
results/data/position/gps/b.data
results/data/position/gps/c.data
results/data/position/gps/info.txt
results/plots
What’s the shortest .gitignore
rule you could write to ignore all
.data
files in result/data/position/gps
? Do not ignore the
info.txt
.
xiv. The Order of Rules¶
Given a .gitignore
file with the following contents: ~~.data
!.data~~
What will be the result?
xv. Log Files¶
You wrote a script that creates many intermediate log-files of the form
log_01
, log_02
, log_03
, etc. You want to keep them but you
do not want to track them through git
.
- Write one
.gitignore
entry that excludes files of the formlog_01
,log_02
, etc. - Test your “ignore pattern” by creating some dummy files of the form
log_01
, etc. - You find that the file
log_01
is very important after all, add it to the tracked files without changing the.gitignore
again. - What other types of files could reside in your directory that you do
not want to track and thus would exclude via
.gitignore
?
xvi. GitHub GUI¶
Browse to your planets
repository on GitHub. Under the Code tab,
find and click on the text that says “XX commits” (where “XX” is some
number). Hover over, and click on, the three buttons to the right of
each commit. What information can you gather/explore from these buttons?
How would you get that same information in the shell?
xvii. GitHub Timestamp¶
Create a remote repository on GitHub. Push the contents of your local repository to the remote. Make changes to your local repository and push these changes. Go to the repo you just created on GitHub and check the timestamps of the files. How does GitHub record times, and why?
xviii. Push vs. Commit¶
How is “git push” different from “git commit”?
ixx. Fixing Remote Settings¶
It happens quite often in practice that you made a typo in the remote URL. This exercise is about how to fix this kind of issue. First start by adding a remote with an invalid URL:
git remote add broken https://github.com/this/url/is/invalid
Do you get an error when adding a remote? Can you think of a command
that would make it obvious that your remote URL was not valid? Can you
figure out how to fix the URL (tip: use git remote -h
)? Don’t forget
to clean up and remove this remote once you are done with this exercise.
xx. GitHub License and README files¶
We learned about creating a remote repository on GitHub, but when you initialized your GitHub repo, you didn’t add a README.md or a license file. If you had, what do you think would have happened when you tried to link your local and remote repositories?
xxi. Review Changes¶
The Owner pushed commits to the repository without giving any information to the Collaborator. How can the Collaborator find out what has changed with command line? And on GitHub?
xxii. Conflicts on Non-textual files¶
What does Git do when there is a conflict in an image or some other non-textual file that is stored in version control?
xxiii. A Typical Work Session¶
You sit down at your computer to work on a shared project that is tracked in a remote Git repository. During your work session, you take the following actions, but not in this order:
- Make changes by appending the number
100
to a text filenumbers.txt
- Update remote repository to match the local repository.
- After your pull request is accepted, Celebrate your success.
- Request a pull from your working branch to the master branch.
- Update local repository to match the remote repository.
- Stage changes to be committed.
- Merge the master branch into your working branch to check for any conflicts.
- Commit changes to the local repository.
- Make a new branch where you will make all your changes, and switch to it.
In what order should you perform these actions to minimize the chances of conflicts? Put the commands above in order in the action column of the table below. When you have the order right, see if you can write the corresponding commands in the command column. A few steps are populated to get you started.
order | action … … . | command … … … … … … . |
---|---|---|
1 | ||
2 | ||
3 | ||
4 | ||
5 | ||
6 | ||
7 | ||
8 | ||
9 | Celebrate! | echo “Cheers!” |