1. Getting Started
1.1 About Version Control
    * Local Version Control Systems
    * Centralized Version Control Systems
    * Distributed Version Control Systems
1.2 A Short History of Git
1.3 Git Basics
    * Snapshots, Not Differences
    * Nearly Every Operation Is Local
    * Git Has Integrity
    * Git Generally Only Adds Data
    * The Three states
1.4 Installing Git
    * Installing From Source
    * Installing On Linux (yum, apt-get)
    * Installing On Mac (binary installer, MacPorts)
    * Installing On Windows (msysgit installer)
1.5 First-Time Git Setup
    * Your Identity
    * Your Editor
    * Your Diff Tool
    * Checking Your Settings
    * Credential Caching
1.6 Getting Help
1.7 Summary

2. Git Basics
2.1 Getting a Git Repository
    * Initializing a Repository in an Existing Directory
    * Cloning an Existing Repository
2.2 Recording Changes to the Repository
    * Checking the Status of Your Files
    * Tracking New Files
    * Staging Modified Files
    * Ignoring Files
    * Viewing Your Staged and Unstaged Changes
    * Committing Your Changes
    * Skipping the Staging Area
    * Removing Files
    * Moving Files
2.3 Viewing the Commit History
    * Limiting Log Output
    * Using a GUI to Visualize History
2.4 Undoing Things
    * Reset Demystified
      * The Three Trees
      * The Workflow
      * The Role of Reset
      * Reset With a Path
      * A Fun Example
      * Check It Out
      * Summary
    * Changing Your Last Commit
    * Unstaging a Staged File
    * Unmodifying a Modified File
    * Undoing All Changes (clean)
2.5 Working with Remotes
    * Showing Your Remotes
    * Adding Remote Repositories
    * Fetching and Pulling from Your Remotes
    * Pushing to Your Remotes
    * Inspecting a Remote
    * Removing and Renaming Remotes
2.6 Tagging
    * Listing Your Tags
    * Creating Tags
    * Annotated Tags
    * Signed Tags
    * Lightweight Tags
    * Verifying Tags
    * Tagging Later
    * Sharing Tags
2.7 Tips and Tricks
    * Auto-Completion
    * Git Aliases
2.8 Summary

3. Git Branching
3.1 What a Branch Is
3.2 Basic Branching and Merging
    * Basic Branching
    * Basic Merging
    * Basic Merge Conflicts
    * Undoing Merges
3.3 Branch Management
3.4 Branching Workflows
    * Long-Running Branches
    * Topic Branches
3.5 Remote Branches
    * Pushing
    * Tracking Branches
    * Deleting Remote Branches
3.6 Rebasing
    * The Basic Rebase
    * More Interesting Rebases
    * The Perils of Rebasing
    * Rebase vs. Merge
3.7 Summary

4. Git on the Server
4.1 The Protocols
    * Local Protocol
    * The SSH Protocol
    * The Git Protocol
    * The HTTP/S Protocol
4.2 Getting Git on a Server
    * Putting the Bare Repository on a Server
    * Small Setups
      * SSH Access
4.3 Generating Your SSH Public Key
4.4 Setting Up the Server
4.5 Public Access
4.6 GitWeb
4.9 Git Daemon
4.8 Gitolite
    * Installing
    * Customising the Install
    * Config File and Access Control Rules
    * Advanced Access Control with "deny" rules
    * Restricting pushes by files changed
    * Personal Branches
    * "Wildcard" repositories
    * Other Features
4.X GitLab
4.X Gerrit
4.10 Other Hosting Options (bitbucket, stash, kiln, etc.)
4.11 Summary

5. Distributed Git
5.1 Distributed Workflows
    * Centralized Workflow
    * Integration-Manager Workflow
    * Dictator and Lieutenants Workflow
5.2 Contributing to a Project
    * Commit Guidelines
    * Private Small Team
    * Private Managed Team
    * Public Small Project
    * Public Large Project (request-pull)
    * Summary
5.3 Maintaining a Project
    * Working in Topic Branches
    * Applying Patches from E-mail
      * Applying a Patch with apply
      * Applying a Patch with am
    * Checking Out Remote Branches
    * Determining What Is Introduced
    * Integrating Contributed Work
      * Merging Workflows
      * Large-Merging Workflows
      * Rebasing and Cherry Picking Workflows
    * Tagging Your Releases
    * Generating a Build Number
    * Preparing a Release
    * The Shortlog
5.4 Summary

X. GitHub
X.X Setting Up a User Account
X.X Projects
    * Creating a repository
    * Adding collaborators
    * Your Project
    * Forking
X.X GitHub Flow
X.X Discussions
    * PR/issue/discussion
    * Markdown
    * Notifications
    * Email
    * Mentions (issue/person/team)
X.X Organizations
    * Teams
X.X Tips & Tricks
    * Importing
    * Subversion Interop
    * hub or gh
    * pull-request refs
    * keyboard shortcuts
    * ignore whitespace
    * rev-parse specs
    * commits by author
    * .diff and .patch
    * Line linking
    * Search/Command Bar
X.X The API
X.X Summary

6. Git Tools
6.1 Revision Selection
    * Single Revisions
    * Short SHA
    * A SHORT NOTE ABOUT SHA-1
    * Branch References
    * RefLog Shortnames
    * Ancestry References
    * Commit Ranges
      * Double Dot
      * Multiple Points
      * Triple Dot
6.2 Interactive Staging
    * Staging and Unstaging Files
    * Staging Patches
6.3 Stashing
    * Stashing Your Work
    * Un-applying a Stash
    * Creating a Branch from a Stash
6.X Searching (git grep)
6.4 Rewriting History
    * Changing the Last Commit
    * Changing Multiple Commit Messages
    * Reordering Commits
    * Squashing a Commit
    * Splitting a Commit
    * The Nuclear Option: filter-branch
      * Removing a File from Every Commit
      * Making a Subdirectory the New Root
      * Changing E-Mail Addresses Globally
6.5 Debugging with Git
    * File Annotation
    * Binary Search
6.6 Submodules
    * Starting with Submodules
    * Cloning a Project with Submodules
    * Superprojects
    * Issues with Submodules
6.7 Subtree Merging
6.X Notes
6.X Bundle
6.X Rerere
9.X History Hacks
    * Grafts (maybe? this is deprecated)
    * Replace
    * Shallow
6.8 Summary

7. Customizing Git
7.1 Git Configuration
    * Basic Client Configuration
    * Colors in Git
    * External Merge and Diff Tools
    * Formatting and Whitespace
    * Server Configuration
7.2 Git Attributes
    * Binary Files
    * Keyword Expansion
    * Exporting Your Repository
    * Merge Strategies
7.3 Git Hooks
    * Installing a Hook
    * Client-Side Hooks
    * Server-Side Hooks
7.4 An Example Git-Enforced Policy
    * Server-Side Hook
    * Client-Side Hooks
7.5 Summary

8. Git and Other Systems
8.1 Git and Subversion
    * git svn
    * Setting Up
    * Getting Started
    * Committing Back to Subversion
    * Pulling in New Changes
    * Git Branching Issues
    * Subversion Branching
      * Creating a New SVN Branch
      * Switching Active Branches
    * Subversion Commands
      * SVN Style History
      * SVN Annotation
      * SVN Server Information
      * Ignoring What Subversion Ignores
      * Git-Svn Summary
8.X Git and Mercurial
8.X Git and Perforce
8.X Git and TFS
8.2 Migrating to Git
    * Importing
    * Subversion
    * Mercurial
    * Perforce
    * TFS
    * A Custom Importer
8.X A Custom Credential Cache
8.3 Summary

X. Git in Other Environments
X.X Graphical Interfaces
    * gitk & git gui
    * GitHub for Windows/Mac
    * (Others)
X.X Git in Visual Studio
X.X Git in Eclipse
X.X Git in Bash
X.X Git in Zsh
X.X Git in Powershell
X.X Git in Your Application
    * libgit2
    * libgit2sharp
    * Objective-Git
    * Rugged
    * Pygit2
    * (others)

9. Git Internals
9.1 Plumbing and Porcelain
9.2 Git Objects
    * Tree Objects
    * Commit Objects
    * Object Storage
9.3 Git References
    * The HEAD
    * Tags
    * Remotes
9.4 Packfiles
9.5 The Refspec
    * Pushing Refspecs
    * Deleting References
9.6 Transfer Protocols
    * The Dumb Protocol
    * The Smart Protocol (include HTTP/S)
      * Uploading Data
      * Downloading Data
9.7 Maintenance and Data Recovery
    * Maintenance
    * Data Recovery
    * Removing Objects
9.X Environment Variables
9.8 Summary
