SC2012BootcampPlan » History » Version 43

Chris Cannam, 2012-04-26 04:23 PM

1 1 Chris Cannam
h1. Plan for Software Carpentry 2012 Boot Camp on Version Control
2 1 Chris Cannam
3 43 Chris Cannam
h2. About the session
4 1 Chris Cannam
5 43 Chris Cannam
The session is a two hour interactive live workshop, using EasyMercurial and the Mercurial command-line tool.
6 2 Chris Cannam
7 43 Chris Cannam
Its goal is to explain version control and introduce Mercurial to researchers who have never used it before, or who want to understand it better.
8 1 Chris Cannam
9 1 Chris Cannam
h2. Outline
10 2 Chris Cannam
11 3 Chris Cannam
The basic plan is:
12 1 Chris Cannam
13 43 Chris Cannam
 # Presentation introduction to version control in general (using either whiteboard drawings or a PowerPoint presentation)
14 43 Chris Cannam
 # Long worked example in which basic topics of version control are worked through using EasyMercurial and then some more advanced topics are returned to using the command-line tool
15 43 Chris Cannam
 # Closing remarks talking about other tools, other topics of interest etc
16 3 Chris Cannam
17 43 Chris Cannam
h2. Worked example
18 7 Chris Cannam
19 43 Chris Cannam
Preliminary: Check that participants have EasyMercurial installed and working. All of the following exercises will be using EasyMercurial unless it says otherwise.
20 7 Chris Cannam
21 43 Chris Cannam
h3. Part 1: Working by yourself
22 43 Chris Cannam
23 43 Chris Cannam
*Topics:* Initialising a repository, committing files, reading history, looking at diffs, reverting unwanted changes, going back in time to look at old versions
24 43 Chris Cannam
25 3 Chris Cannam
 ** We will be working on a recipe for fish stew for a future recipe book
26 3 Chris Cannam
 ** Make a new directory, create a text file @fishstew.txt@ in it, start adding an ingredients list, save
27 4 Chris Cannam
 ** Run up EasyMercurial, "Open" that directory, see @fishstew.txt@ in untracked file list, explain this
28 1 Chris Cannam
 ** Add file, commit, supply a message, note that we now have some history
29 17 Chris Cannam
 ** Make a change, note that files are marked as modified, note possible presence of backup file (ending ~ or .bak) from editor -- _we'll come back to that in a moment_
30 13 Chris Cannam
 ** A changeset records the state of all files, not just one file: add another file, @omelette.txt@ and add that
31 8 Chris Cannam
 ** Commit change, review history, look at the diff
32 1 Chris Cannam
 ** _Digression: every action we're taking here corresponds to one command-line command: show hg log, hg diff etc_
33 10 Chris Cannam
 ** Go back to that backup file in My Work, add it to ignored list, commit
34 13 Chris Cannam
 ** The history is not just for information: we can go back to the previous version by updating to it...
35 12 Chris Cannam
 ** ... and then a normal update gets us back to the latest version again
36 11 Chris Cannam
 ** Now, let's say this is the version we send off to our agent to see whether (s)he can sell it to a publisher. (Or whatever we do these days.) Tag it as v0.1 -- _digression about sensible tag names on whiteboard?_
37 42 Chris Cannam
 ** Make and commit another change, this one involving renaming a file
38 11 Chris Cannam
 ** What if we make a change and decide we don't want to commit it? Edit something, then hit Revert
39 16 Chris Cannam
 ** ... but we are still in big trouble if our computer fails. Thus:
40 16 Chris Cannam
 * *Worked example, part 2: Working by myself "with backups"*
41 16 Chris Cannam
 ** *Topics:* Clone, push and pull, using an online repo
42 18 Chris Cannam
 ** Register an account on Bitbucket and create a new private repository
43 18 Chris Cannam
 ** Look up its URL
44 18 Chris Cannam
 ** In EasyMercurial, hit the Push button, enter URL, push to remote repo, check that the history is present and correct on the site
45 20 Chris Cannam
 ** Make another change locally, commit, push, and check the history on site again
46 1 Chris Cannam
 ** Exit EasyMercurial. Delete the local repository / working copy folder completely!
47 20 Chris Cannam
 ** Start EasyMercurial again, see that _(sniff)_ the working copy is lost. Clone it again from Bitbucket and note that the history is all there
48 35 Chris Cannam
 ** _Digression: Note command-line usage again, hg push, hg pull, hg clone: show a sequence of clones, modifying the last one and pushing back along the chain?_
49 23 Chris Cannam
 * *Worked example, part 3: Introducing other developers*
50 22 Chris Cannam
 ** *Topics:* Conflicts, merges
51 21 Chris Cannam
 ** Pair up and, in each pair, decide whose Bitbucket repo you will be working on and whose we'll just leave for now. (We should pair the "instructor" with someone as well)
52 33 Chris Cannam
 ** Remark: in real-world use, this could very well be the same person just using two different computers
53 21 Chris Cannam
 ** The second person in the pair should then clone the repository from Bitbucket
54 24 Chris Cannam
 ** Both people can then make some edits: they should edit the same file
55 24 Chris Cannam
 ** The _second_ user should push their changes to the remote repo first
56 24 Chris Cannam
 ** The _first_ user then tries to push. They should get the "Push failed... The local repository may have been changed" message
57 33 Chris Cannam
 ** Then the first user pulls instead. (Perhaps checks the Incoming list first?) History graph now shows two heads -- _digression on sociological nature of conflict_ a la Greg if feeling expansive
58 30 Chris Cannam
 ** Hit Merge, get the merge window up. Do an "instructor-guided" merge
59 30 Chris Cannam
 ** Commit, push, get collaborator to pull
60 31 Chris Cannam
 ** Run annotate (blame) on the recipe to see who changed what and when
61 31 Chris Cannam
 * *Worked example, part 4: More sophisticated business at the command-line*
62 31 Chris Cannam
 ** @hg archive@: packaging from a tag
63 31 Chris Cannam
 ** @hg id@: provenance when running experiments
64 38 Chris Cannam
 ** @hg bisect@: finding the origin of bugs you can't see (analogy with @hg annotate@ for finding bugs you can see)
65 1 Chris Cannam
 
66 42 Chris Cannam
Things not yet incorporated into the above: Copying, renaming, deleting files; Branching and merging amonst branches; Stuff that is different in other systems
67 1 Chris Cannam
68 37 Chris Cannam
Should we cover (named) branches and merges between them? I think yes, if there is time.
69 31 Chris Cannam
70 1 Chris Cannam
Against: perhaps a level of complication too far for a two-hour intro; Greg doesn't cover them in the Subversion version; lessons learned from Hg are not immediately applicable to git or Subversion because the branching methods are somewhat different.
71 32 Chris Cannam
72 32 Chris Cannam
For: they are much simpler to use in Mercurial than in Subversion!
73 40 Chris Cannam
74 40 Chris Cannam
h2. Quiz
75 40 Chris Cannam
76 40 Chris Cannam
The Software Carpentry Subversion course includes a quiz -- I like quizzes. Let's try adjusting the questions for Mercurial:
77 40 Chris Cannam
78 41 Chris Cannam
 * Why is it a good idea to use version control on your projects?
79 41 Chris Cannam
 * What is a version control repository?
80 41 Chris Cannam
 * Suppose you’ve created a new file on your computer and you want to start using version control for it. How do you go about doing this?
81 41 Chris Cannam
 * Jon is working on a version-controlled project with Ainsley and Tommy. He wakes up early one day, ready to do some work on the project. What is the first thing he should do?
82 41 Chris Cannam
 * Tommy and Jon have up-to-date local repositories, and are both editing a file that contains 10 lines of data. Jon makes a change to the fifth line, and commits and pushes his changes to the remote repository they're both using. Tommy makes a change to the first line of the file, commits his changes, and tries to push them. What will happen, and what should Tommy do next?
83 41 Chris Cannam
 * Ainsley and Jon are up-to-date, and are both editing the sixth line of a file. Jon commits and pushes his changes first. When Ainsley commits and tries to push, what will happen, and what should she do next?
84 41 Chris Cannam
 * How do you undo local changes to files that have not been committed?
85 40 Chris Cannam
 * Give the shell commands you would use to accomplish the following tasks:
86 40 Chris Cannam
87 41 Chris Cannam
    Check out the repository located at http://example.com/repo into the directory /cygwin/home/repo
88 41 Chris Cannam
    View the log of changes
89 41 Chris Cannam
    Add the file “experiment.txt” to the repository
90 41 Chris Cannam
    Commit the file to the repository.
91 41 Chris Cannam
    Update the local copy to reflect any new changes in the remote repository