title | subtitle | author | tags |
---|---|---|---|
Working with others |
Version Control Part II |
Peter Hill |
version-control practical |
Following up on part one of our intro to version control, this week we learnt how to use a popular git web service to work with other people, including pull requests and code review.
You can get the slides for the talk here
- Recap
- Workflows
- Merge requests
- repository/repo: a project under version control
- diff: a set of changes between two files or versions of files
- commit: a saved "box of diffs" in the repo, or snapshot of the repo at a given time
- working tree: a project as it currently looks like on disk
(i.e. what you see with
ls
or in your editor) - index: the "staging area" or box of diffs
- Shows differences between individual lines
- Lines beginning with "
-
" have been removed - Lines beginning with "
+
" have been added - Changed lines are shown as removal plus addition
$ git status # Current status of working tree
$ git add <file> # Stage a file
$ git commit # Make a commit
$ git log # View history
$ git checkout -b <branch> # Checkout a new branch
$ git checkout <branch> # Checkout an existing branch
$ git merge <branch> # Merge a branch into this one
-
Conflicts happen when both branches touch the same line(s) in a file
-
Conflicts are marked with a diff-like syntax
-
To resolve the conflict, just go to the conflicting files and edit them appropriately
-
There are lots of tools that can help you with this, e.g. ediff, meld, diff3
<<<<<<< HEAD line changed in branch1 ======= line changed in branch2 >>>>>>> merging branch
-
Just delete all the special markers and the lines(s) you don't want to keep
-
Sometimes you want some combination of both regions -- just edit the lines to keep what you want
-
You can bail out of a merge with
git merge --abort
- Sign up with York email address to get academic account
- Two steps: sign up for Bitbucket account, and then get a username
- I know, it's weird
- Click the big
+
on the left - Click "Repository"
- Give it a name and decide if you want it public or private
- Make sure "Include a README" is unticked
- Click "Create repository"
- Follow the instructions on Bitbucket:
# Add the remote
$ git remote add origin https://bitbucket.org/<username>/<reponame>.git
$ git push origin master
git push
: Update remote refs along with associated objects- Glossary "remote": a version of this repository that is located elsewhere
- Glossary "refs": reference to some git object (normally a branch)
- Glossary: "tracking branch": a local reference to this branch on a remote repo
-
From the three-dot menu in the top right, click "Add file"
-
Name the file "README.md" and some text
-
Click "Commit" in the bottom right
-
Now we need to get this file in our local version...
-
The quick way:
$ git pull
git pull
: Fetch from and integrate with another repository or a local branch- If the branch has a tracking branch (i.e. is linked to some branch
on a remote), then
git pull
does the Right Thing - Otherwise, specify remote and branch:
git pull <remote> <branch>
- Everything straight into master
- Ok for very small teams or Google
- Changes made in separate branches
- Good for teams
- Pull request for merging from your branch into another branch
- A fork is a copy of a repo
- Good for open source projects without fixed developers
- Pull request for merging from your repo into theirs
- Get a chance for code review
- Super important!
- Can run tests automatically
- Tests are great, automatic tests are better
- Lots of services for running tests automatically
- Jenkins, Travis, Bitbucket pipelines
- Fork the example repo:
https://bitbucket.org/ZedThree/coding-club-pull-request-tutorial
- Big plus on the left hand side, at the bottom
- Clone it to your computer
- Run
pip3 install --user -r requirements.txt
- Run
pytest
to check everything works - Add upstream as a remote
- You don't have write access to upstream but you can pull changes
- Make a new branch
- Add a file called
<your_name>.py
, and a test file,test_<your_name>.py
- Add a simple function and test
- See
test_simple_calc.py
for example
- See
- Run
pytest
to check it all still works - Push to your repo
- Go to upstream and open a pull request
- Review your neighbour's PR
- Looked at merge conflicts before
- But now trickier problem: conflicts on same branch!
- Can try
git pull --rebase
- Will try to rebase your commits on top of the remote ones
- If that goes wrong:
git rebase --abort
- You've started working on
master
instead ofmy_branch
- Now you and
origin
have made lots of commits - Find the commit where you diverged, then:
$ git checkout -b temp_branch
$ git checkout master
$ git reset --hard <commit>
$ git pull
$ git merge temp_branch
$ git checkout -b wip_branch
$ git add <changes>
$ git commit # These first three if necessary
$ git checkout <problem branch>
$ git checkout -b fix_problem
<do whatever it was you were trying to do until it works>
$ git branch --move <problem branch> <temp name>
$ git branch --move fix_probem <problem branch>
- Git book: https://git-scm.com/book
- Atlassian tutorial: https://www.atlassian.com/git/tutorials
- Codecademy: https://www.codecademy.com/learn/learn-git