3 In older version control systems, checkout is the standard operation to get files. You retrieve a bunch of files in a particular saved state.
5 In Git and other distributed version control systems, cloning is the standard operation. To get files, you create a 'clone' of the entire repository. In other words, you practically mirror the central server. Anything the main repository can do, you can do.
9 I can tolerate making tarballs or using *rsync* for backups and basic syncing. But sometimes I edit on my laptop, other times on my desktop, and the two may not have talked to each other in between.
11 Initialize a Git repository and commit your files on one machine. Then on the other:
13 $ git clone other.computer:/path/to/files
15 to create a second copy of the files and Git repository. From now on,
18 $ git pull other.computer:/path/to/files HEAD
20 will 'pull' in the state of the files on the other computer into the one you're working on. If you've recently made conflicting edits in the same file, Git will let you know and you should commit again after resolving them.
22 === Classic Source Control ===
24 Initialize a Git repository for your files:
28 $ git commit -m "Initial commit"
30 On the central server, initialize a 'bare repository' in some directory:
35 $ touch proj.git/git-daemon-export-ok
37 Start the Git daemon if necessary:
39 $ git daemon --detach # it may already be running
41 For Git hosting services, follow the instructions to setup the initially
42 empty Git repository. Typically one fills in a form on a webpage.
44 'Push' your project to the central server with:
46 $ git push central.server/path/to/proj.git HEAD
48 To check out the source, a developer types:
50 $ git clone central.server/path/to/proj.git
52 After making changes, the developer saves changes locally:
56 To update to the latest version:
60 Any merge conflicts should be resolved then committed:
64 To check in local changes into the central repository:
68 If the main server has new changes due to activity by other developers, the
69 push fails, and the developer should pull the latest version, resolve any merge conflicts, then try again.
71 Developers must have SSH access for the above pull and push commands.
72 However, anyone can see the source by typing:
74 $ git clone git://central.server/path/to/proj.git
76 The native git protocol is like HTTP: there is no authentication, so anyone can
77 retrieve the project. Accordingly, by default, pushing is forbidden via the git
82 For a closed-source project, omit the touch command, and ensure you never
83 create a file named `git-daemon-export-ok`. The repository can no longer be
84 retrieved via the git protocol; only those with SSH access can see it. If all
85 your repos are closed, running the git daemon is unnecessary because all
86 communication occurs via SSH.
88 === Bare repositories ===
90 A bare repository is so named because it has no working directory; it only contains files that are normally hidden away in the `.git` subdirectory. In other words, it maintains the history of a project, and never holds a snapshot of any given version.
92 A bare repository plays a role similar to that of the main server in a
93 centralized version control system: the home of your project. Developers clone
94 your project from it, and push the latest official changes to it. Typically it
95 resides on a server that does little else but disseminate data. Development
96 occurs in the clones, so the home repository can do without a working
99 Many Git commands fail on bare repositories unless the `GIT_DIR` environment variable is set to the repository path, or the `--bare` option is supplied.
101 === Push versus pull ===
103 Why did we introduce the push command, rather than rely on the familiar pull
104 command? Firstly, pulling fails on bare repositories: instead you must 'fetch',
105 a command we later discuss. But even if we kept a normal repository on the
106 central server, pulling into it would still be cumbersome. We would have to
107 login to the server first, and give the pull command the network address of the
108 machine we're pulling from. Firewalls may interfere, and what if we have no
109 shell access to the server in the first place?
111 However, apart from this case, we discourage pushing into a repository, because confusion can ensue when the destination has a working directory.
113 In short, while learning Git, only push when the target is a bare repository; otherwise pull.
115 === Forking a Project ===
117 Sick of the way a project is being run? Think you could do a better job? Then on your server:
119 $ git clone git://main.server/path/to/files
121 Next, tell everyone about your fork of the project at your server.
123 At any later time, you can merge in the changes from the original project with:
127 === Ultimate Backups ===
129 Want numerous tamper-proof geographically diverse redundant archives? If your project has many developers, don't do anything! Every clone of your code is effectively a backup. Not just of the current state, but of your project's entire history. Thanks to cryptographic hashing, if anyone's clone becomes corrupted, it will be spotted as soon as they try to communicate with others.
131 If your project is not so popular, find as many servers as you can to host clones.
133 The truly paranoid should always write down the latest 20-byte SHA1 hash of the HEAD somewhere safe. It has to be safe, not private. For example, publishing it in a newspaper would work well, because it's hard for an attacker to alter every copy of a newspaper.
135 === Light-Speed Multitask ===
137 Say you want to work on several features in parallel. Then commit your project and run:
139 $ git clone . /some/new/directory
141 Thanks to http://en.wikipedia.org/wiki/Hard_link[hardlinking], local clones
142 require less time and space than a plain backup.
144 You can now work on two independent features simultaneously. For example, you
145 can edit one clone while the other is compiling. At any time, you can commit
146 and pull changes from the other clone:
148 $ git pull /the/other/clone HEAD
150 === Guerilla Version Control ===
152 Are you working on a project that uses some other version control system, and you sorely miss Git? Then initialize a Git repository in your working directory:
156 $ git commit -m "Initial commit"
160 $ git clone . /some/new/directory
162 Now go to the new directory and work here instead, using Git to your heart's content. Once in a while, you'll want to sync with everyone else, in which case go to the original directory, sync using the other version control system, and type:
165 $ git commit -m "Sync with everyone else"
167 Then go to the new directory and run:
169 $ git commit -a -m "Description of my changes"
172 The procedure for giving your changes to everyone else depends on the other version control system. The new directory contains the files with your changes. Run whatever commands of the other version control system are needed to upload them to the central repository.
174 Subversion, perhaps the best centralized version control system, is used by countless projects. The *git svn* command automates the above for Subversion repositories, and can also be used to http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[export a Git project to a Subversion repository].
178 Mercurial is a similar version control system that can almost seamlessly work in tandem with Git. With the `hg-git` plugin, a Mercurial user can losslessly push to and pull from a Git repository.
180 Obtain the `hg-git` plugin with Git:
182 $ git clone git://github.com/schacon/hg-git.git
186 $ hg clone http://bitbucket.org/durin42/hg-git/
188 Sadly, I am unaware of an analogous plugin for Git. For this reason, I advocate Git over Mercurial for the main repository, even if you prefer Mercurial. With a Mercurial project, usually a volunteer maintains a parallel Git repository to accommodate Git users, whereas thanks to the `hg-git` plugin, a Git project automatically accommodates Mercurial users.
190 Although the plugin can convert a Mercurial repository to a Git repository by pushing to an empty repository, this job is easier with the `hg-fast-export.sh` script, available from:
192 $ git clone git://repo.or.cz/fast-export.git
194 To convert, in an empty directory:
197 $ hg-fast-export.sh -r /hg/repo
199 after adding the script to your `$PATH`.
203 We briefly mention Bazaar because it is the most popular free distributed
204 version control system after Git and Mercurial.
206 Bazaar has the advantage of hindsight, as it is relatively young; its designers could learn from mistakes of the past, and sidestep minor historical warts. Additionally, its developers are mindful of portability and interoperation with other version control systems.
208 A `bzr-git` plugin lets Bazaar users work with Git repositories to some extent. The `tailor` program converts Bazaar repositories to Git repositories, and can do so incrementally, while `bzr-fast-export` is well-suited for one-shot conversions.
210 === Why I use Git ===
212 I originally chose Git because I heard it could manage the unimaginably unmanageable Linux kernel source. I've never felt a need to switch. Git has served admirably, and I've yet to be bitten by its flaws. As I primarily use Linux, issues on other platforms are of no concern.
214 Also, I prefer C programs and bash scripts to executables such as Python scripts: there are fewer dependencies, and I'm addicted to fast running times.
216 I did think about how Git could be improved, going so far as to write my own Git-like tool, but only as an academic exercise. Had I completed my project, I would have stayed with Git anyway, as the gains are too slight to justify using an oddball system.
218 Naturally, your needs and wants likely differ, and you may be better off with another system. Nonetheless, you can't go far wrong with Git.