Unix 103: fixed formatting, added TODO, and more git commands
authorKyle Spaans <kspaans@student.math.uwaterloo.ca>
Tue, 14 Jul 2009 23:28:59 +0000 (19:28 -0400)
committerKyle Spaans <kspaans@student.math.uwaterloo.ca>
Tue, 14 Jul 2009 23:28:59 +0000 (19:28 -0400)
code-management.pod

index 6302142..92e161a 100644 (file)
@@ -40,7 +40,7 @@ them here.
 
 The I<repository> is location where all of the data and meta data used by the
 VCS is kept: your files, different versions of your files, extra logging data
-that describes the changes, etc.  All actions performed by the VCS will happen
+that describes the changes, etc. All actions performed by the VCS will happen
 against the I<repository>.
 
 =item History
@@ -133,8 +133,6 @@ Goto 4.
 
 Someone will have to help me out here.
 
-=cut
-
 This is really all that you need if you are working alone and want a tool to
 keep track of metadata for you. This way when you wake up the next morning, you
 can remember why you made those particular changes to that file last night.
@@ -163,6 +161,10 @@ When you add files with C<git add>, they get into the I<index>. Only changes
 which have been added to the index will be included in a commit. You can see
 a diff of the changes in the index using the command C<git diff --cached>.
 
+=item HEAD
+
+Git's nickname for the latest commit in the current branch.
+
 =back
 
 =head3 Get oriented with C<git status>
@@ -190,6 +192,31 @@ using the contents from I<version>, which can be a commit.
 
 E.G. C<git checkout HEAD^ hello.c>
 
+=head3 Fixing Mistakes with C<git reset> and C<git revert>
+
+Have you completely destroyed your working directory? Get it all back with
+C<git reset --hard>. This throws away changes to the working directory and index
+and gets the content from the latest commit to the repository. Remember that to
+do this for a single file, use C<git checkout F<file>>.
+
+If you are completely unsatisfied with your previous two commits worth of work
+you can completely erase them from your repository's history with
+C<git reset>. C<git reset --hard HEAD~2>. If you want to publicly admit to your
+mistakes you can record this in your history by using C<git revert> instead. It
+will create a commit specifying that you've reverted things. You will need to
+specifically revert each commit by refering to it's commit ID.
+C<git revert some-commit> will do this.
+
+Did you forget something or mistype your commit message? Use
+C<git commit --amend> to modify the most recent commit.
+
+=head4 Warning: Modifying your History
+
+Using C<git reset> and C<git commit --amend> will modify your history. If
+someone else has seen the state of your repository between when you made a
+commit and when you changed the history they could get very confused! Or worse,
+Git will get very confused.
+
 =head2 More Advanced Usage
 
 Some less common or more tool-specific commands.
@@ -224,10 +251,45 @@ regular expression pattern using C<git grep "pattern">.
 
 Without VCS, sharing development of source code would be almost impossible.
 
+Because of Git's distributed nature, there are many ways you can setup sharing
+of your repository. Push/pull model. Permissions.
+
+If you set the permissions correctly when you setup your Subversion repository
+then it is already setup for sharing. Someone else can checkout the project and
+C<svn update> and C<svn commit>. Alternatively if you don't want to give
+someone else write (commit) access to your repository, they can generate
+patches with C<svn diff>.
+
 =head3 Merge Conflicts
 
 The biggest headache when you merge someone else's code is the conflicts that
-can arise!
+can arise! When you C<git merge some-branch> Git will tell you if there are
+conflicts:
+ kspaans@csclub:~/foo$ git merge otherbranch
+ Auto-merged blahfile
+ CONFLICT (content): Merge conflict in blahfile
+ Automatic merge failed; fix conflicts and then commit the result.
+ kspaans@csclub:~/foo$ cat blahfile
+ <<<<<<< HEAD:blahfile
+ Hello World
+ =======
+ I'm the new first line.
+ Hello, world!
+ This is the final line.
+ >>>>>>> otherbranch:blahfile
+ kspaans@csclub:~/foo$ git status
+ blahfile: needs merge
+ # On branch master
+ # Changed but not updated:
+ #   (use "git add <file>..." to update what will be committed)
+ #
+ #       unmerged:   blahfile
+ #
+ no changes added to commit (use "git add" and/or "git commit -a")
+You can see the conflict markers that Git added, and the output from
+C<git status> will indicate that you are in the middle of a failed merge. Fix
+the conflicting files with your text editor and commit them. Git will have
+included a note about the merge conflict in your commit message for you.
 
 =head2 Disclaimer
 
@@ -248,3 +310,8 @@ A 3rd year Computational Math student, Kyle has been in and around the CSC
 since his first term at Waterloo. He's been using Linux for years now, and
 thinks the command line and command line-based tools are important for every
 *nix user to know.
+
+=head2 TODO
+
+Find out exactly which undergrad machines have git installed. Make sure that
+svn works as expected on those same machines (or all machines).