391lecture09 Git 16au
391lecture09 Git 16au
Lecture 9
Version control with Git
slides created by Ruth Anderson & Marty Stepp, images from http://git-scm.com/book/en/
http://www.cs.washington.edu/391/
1
Problems Working Alone
• Ever done one of the following?
Had code that worked, made a bunch of changes and saved it, which
broke the code, and now you just want the working version back…
Accidentally deleted a critical file, hundreds of lines of code gone…
Somehow messed up the structure/contents of your code base, and
want to just “undo” the crazy action you just did
Hard drive crash!!!! Everything’s gone, the day before deadline.
• Possible options:
Save as (MyClass-v1.java)
• Ugh. Just ugh. And now a single line change results in duplicating the
entire file…
2
Problems Working in teams
Whose computer stores the "official" copy of the project?
• Can we store the project files in a neutral "official" location?
Wiki’s
• Wiki’s are all about version control, managing updates, and allowing
rollbacks to previous versions
4
Software Version control
• Many version control systems are designed and used especially for
software engineering projects
examples: CVS, Subversion (SVN), Git, Monotone, BitKeeper, Perforce
not particular to source code; can be used for papers, photos, etc.
• but often works best with plain text/code files
5
Repositories
• Repository (aka “repo”): a location storing a copy of all files.
you don't edit files directly in the repo;
you edit a local working copy or “working tree”
then you commit your edited files into the repo
• There may be only one repository that all users share (CVS,
Subversion)
• Or each user could also have their own copy of the repository (Git,
Mercurial)
6
What to put in a Repo?
• Everything needed to create your project:
Source code (Examples: .java, .c, .h, .cpp )
Build files (Makefile, build.xml)
Other resources needed to build your project: icons, text etc.
7
Repository Location
• Can create the repository anywhere
Can be on the same computer that you’re going to work on, which might
be ok for a personal project where you just want rollback protection
• Options:
attu, CSE GitLab, GitHub (do NOT use GitHub for homework!!!)
8
Aside: So what is GitHub?
• GitHub.com is a site for online storage of Git repositories.
• Many open source projects use it, such as the Linux kernel.
• You can get free space for open source projects or you can pay for
private projects.
• Do NOT use GitHub to store your homework!!
Question: Do I have to use GitHub to use Git?
Answer: No!
• you can use Git completely locally for your own purposes, or
• you can use the CSE GitLab server, or
• you could share a repo with users on the same file system (e.g. attu)
as long everyone has the needed file permissions.
9
CSE GitLab
Everyone in this course has been given an account on CSE GitLab
To use CSE GitLab:
1.Log onto CSE GitLab: https://gitlab.cs.washington.edu/
IMPORTANT: If you have a CSENetID use that, otherwise use your UWNetID
2.Add an ssh key: https://gitlab.cs.washington.edu/help/ssh/README.md
Follow the instructions in README.md created specifically for you.
For me, I type:
ssh-keygen -t rsa -C
"[email protected]"
• Just hit return to accept the default file location and you do not need a
password so hit return both times when prompted for a password
Then type: cat ~/.ssh/id_rsa.pub
Copy-paste the key to the 'SSH Keys' section under ‘Profile Settings'
in your user profile on CSE GitLab
10
Git
HTTP://XKCD.COM/1597/
11
Git Resources
• At the command line: (where <verb> = config, add, commit, etc.)
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
12
History of Git
• Came out of Linux development community
• Linus Torvalds, 2005
• Initial goals:
Speed
Support for non-linear development (thousands of parallel branches)
Fully distributed
Able to handle large projects like Linux efficiently
13
Git uses a distributed model
Centralized Model Distributed Model
Note: working directory sometimes called the “working tree”, staging area sometimes called the “index”.
16
Git file lifecycle
17
Basic Workflow
Basic Git workflow:
•Notes:
1. If a particular version of a file is in the git directory, it’s considered committed.
2. If it’s modified but has been added to the staging area, it is staged.
3. If it was changed since it was checked out but has not been staged, it is modified.
18
Get ready to use Git!
1. Set the name and email for Git to use when you commit:
$ git config --global user.name “Bugs Bunny”
$ git config --global user.email [email protected]
• You can call git config –-list to verify these are set.
• These will be set globally for all Git projects you work with.
• You can also set variables on a project-only basis by not using the
--global flag.
• You can also set the editor that is used for writing commit messages:
$ git config --global core.editor emacs (it is vim by default)
• The latest version of git will also prompt you that push.default is not set, you
can make this warning go away with:
$ git config --global push.default simple
19
Create a local copy of a repo
2. Two common scenarios: (only do one of these)
a) To clone an already existing repo to your current directory:
$ git clone <url> [local dir name]
This will create a directory named local dir name, containing a working copy of the
files from the repo, and a .git directory which you can ignore (used to hold
the staging area and your local repo)
Example: git clone [email protected]:rea/superTest.git
b) To create a Git repo in your current directory:
$ git init
This will create a .git directory in your current directory which you can ignore
(used to hold the staging area and your local repo).
Then you can commit files in your current directory into the local repo:
$ git add file1.java
$ git commit –m “initial project version ”
20
Git commands
command description
git clone url [dir] copy a git repository so you can add to it
git add files adds file contents to the staging area
git commit records a snapshot of the staging area
git status view the status of your files in the working
directory and staging area
git diff shows diff of what is staged and what is
modified but unstaged
git help [command] get help info about a particular command
git pull fetch from a remote repo and try to merge
into the current branch
git push push your new branches and data to a
remote repository
others: init, reset, branch, checkout, merge, log, tag
21
Adding & Committing files
1. The first time we ask a file to be tracked, and every time before
we commit a file we must add it to the staging area:
$ git add README.txt hello.java
This takes a snapshot of these files at this point in time and adds it to
the staging area.
Note: To unstage a change on a file before you have committed it:
$ git reset HEAD filename
Note: These commands are just acting on your local version of repo.
22
Use Good Commit Messages
HTTP://XKCD.COM/1296/
23
Status and Diff
• To view the status of your files in the working directory and staging
area:
$ git status or
$ git status –s
(-s shows a short one line version)
25
After adding file to staging area…
$ git add rea.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: rea.txt
#
$ git status -s
M rea.txt Note: M is in first column = “staging area”
$ git diff Note: Shows nothing, no modifications that have not been staged.
$ git diff --cached Note: Shows staged modifications.
diff --git a/rea.txt b/rea.txt
index 66b293d..90b65fd 100644
--- a/rea.txt
+++ b/rea.txt
@@ -1,2 +1,4 @@
Here is rea's file.
+
+One new line added.
26
Viewing logs
To see a log of all changes in your local repo:
•$ git log or
•$ git log --oneline (to show a shorter version)
27
Pulling and Pushing
Good practice:
1.Add and Commit your changes to your local repo
2.Pull from remote repo to get most recent changes (fix conflicts if
necessary, add and commit them to your local repo)
3.Push your changes to the remote repo
To fetch the most recent updates from the remote repo into your
local repo, and put them into your working directory:
$ git pull origin master
To push your changes from your local repo to the remote repo:
$ git push origin master
Notes: origin = an alias for the URL you cloned from
master = the remote branch you are pulling from/pushing to,
(the local branch you are pulling to/pushing from is your current branch)
28
Avoiding Common Problems
From CSE 331: https://courses.cs.washington.edu/courses/cse331/16sp/tools/versioncontrol.html#git-pitfalls
•Do not edit the repository (the .git directory) manually. It wasn't
designed for modifications by humans.
•Try not to make many drastic changes at once. Instead, make
multiple commits, each of which has a single logical purpose. This will
minimize merge conflicts. This is good coding practice in general.
•Always git pull before editing a file. It's easy to forget this. If you
forget, you may end up editing an outdated version, which can cause
nasty merge conflicts.
•Don't forget git push after you have made and committed changes.
They are not copied to the remote repository until you do a push.
29
Branching
To create a branch called experimental:
•$ git branch experimental
To list all branches: (* shows which one you are currently on)
•$ git branch
Later on, changes between the two branches differ, to merge changes from
experimental into the master:
•$ git checkout master
•$ git merge experimental
30
SVN vs. Git
• SVN:
central repository approach – the main repository is the only “true”
source, only the main repository has the complete file history
Users check out local copies of the current version
• Git:
Distributed repository approach – every checkout of the repository is a
full fledged repository, complete with history
Greater redundancy and speed
Branching and merging repositories is more heavily used as a result
31
Wrap-up
• You *will* use version control software when working on projects,
both here and in industry
Rather foolish not to
Advice: just set up a repository, even for small projects, it will save you
time and hassle
• HW9 (Git) has more details and walks you through creating a Git
repo and adding to a shared repo.
32