]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/everyday.txt
Merge branch 'jn/test-sanitize-git-env'
[thirdparty/git.git] / Documentation / everyday.txt
CommitLineData
db9536c8
JH
1Everyday GIT With 20 Commands Or So
2===================================
3
bce02c1b
AK
4<<Individual Developer (Standalone)>> commands are essential for
5anybody who makes a commit, even for somebody who works alone.
db9536c8
JH
6
7If you work with other people, you will need commands listed in
119550af 8the <<Individual Developer (Participant)>> section as well.
db9536c8 9
119550af 10People who play the <<Integrator>> role need to learn some more
db9536c8
JH
11commands in addition to the above.
12
13<<Repository Administration>> commands are for system
119550af
BF
14administrators who are responsible for the care and feeding
15of git repositories.
db9536c8
JH
16
17
db9536c8
JH
18Individual Developer (Standalone)[[Individual Developer (Standalone)]]
19----------------------------------------------------------------------
20
21A standalone individual developer does not exchange patches with
7872b188 22other people, and works alone in a single repository, using the
db9536c8
JH
23following commands.
24
bce02c1b
AK
25 * linkgit:git-init[1] to create a new repository.
26
5162e697 27 * linkgit:git-show-branch[1] to see where you are.
db9536c8 28
5162e697 29 * linkgit:git-log[1] to see what happened.
db9536c8 30
5162e697 31 * linkgit:git-checkout[1] and linkgit:git-branch[1] to switch
db9536c8
JH
32 branches.
33
5162e697 34 * linkgit:git-add[1] to manage the index file.
44db136c 35
5162e697 36 * linkgit:git-diff[1] and linkgit:git-status[1] to see what
44db136c 37 you are in the middle of doing.
db9536c8 38
5162e697 39 * linkgit:git-commit[1] to advance the current branch.
db9536c8 40
5162e697 41 * linkgit:git-reset[1] and linkgit:git-checkout[1] (with
db9536c8
JH
42 pathname parameters) to undo changes.
43
5162e697 44 * linkgit:git-merge[1] to merge between local branches.
db9536c8 45
5162e697 46 * linkgit:git-rebase[1] to maintain topic branches.
db9536c8 47
5162e697 48 * linkgit:git-tag[1] to mark known point.
db9536c8 49
44db136c
JH
50Examples
51~~~~~~~~
52
268b827d 53Use a tarball as a starting point for a new repository.::
1e2ccd3a 54+
44db136c
JH
55------------
56$ tar zxf frotz.tar.gz
57$ cd frotz
3e5970a4 58$ git init
180c4746 59$ git add . <1>
d336fc09 60$ git commit -m "import of frotz source tree."
180c4746 61$ git tag v2.43 <2>
48aeecdc
SE
62------------
63+
180c4746
JH
64<1> add everything under the current directory.
65<2> make a lightweight, unannotated tag.
44db136c 66
01f49e34 67Create a topic branch and develop.::
1e2ccd3a 68+
44db136c 69------------
180c4746
JH
70$ git checkout -b alsa-audio <1>
71$ edit/compile/test
72$ git checkout -- curses/ux_audio_oss.c <2>
73$ git add curses/ux_audio_alsa.c <3>
74$ edit/compile/test
268b827d 75$ git diff HEAD <4>
180c4746 76$ git commit -a -s <5>
44db136c 77$ edit/compile/test
180c4746 78$ git reset --soft HEAD^ <6>
44db136c 79$ edit/compile/test
180c4746
JH
80$ git diff ORIG_HEAD <7>
81$ git commit -a -c ORIG_HEAD <8>
82$ git checkout master <9>
268b827d 83$ git merge alsa-audio <10>
180c4746
JH
84$ git log --since='3 days ago' <11>
85$ git log v2.43.. curses/ <12>
48aeecdc
SE
86------------
87+
180c4746 88<1> create a new topic branch.
268b827d 89<2> revert your botched changes in `curses/ux_audio_oss.c`.
180c4746 90<3> you need to tell git if you added a new file; removal and
268b827d 91modification will be caught if you do `git commit -a` later.
180c4746
JH
92<4> to see what changes you are committing.
93<5> commit everything as you have tested, with your sign-off.
94<6> take the last commit back, keeping what is in the working tree.
95<7> look at the changes since the premature commit we took back.
96<8> redo the commit undone in the previous step, using the message
97you originally wrote.
98<9> switch to the master branch.
c14261ea 99<10> merge a topic branch into your master branch.
01f49e34 100<11> review commit logs; other forms to limit output can be
268b827d
JH
101combined and include `\--max-count=10` (show 10 commits),
102`\--until=2005-12-10`, etc.
103<12> view only the changes that touch what's in `curses/`
104directory, since `v2.43` tag.
44db136c
JH
105
106
db9536c8
JH
107Individual Developer (Participant)[[Individual Developer (Participant)]]
108------------------------------------------------------------------------
109
110A developer working as a participant in a group project needs to
111learn how to communicate with others, and uses these commands in
112addition to the ones needed by a standalone developer.
113
5162e697 114 * linkgit:git-clone[1] from the upstream to prime your local
01f49e34
JH
115 repository.
116
5162e697 117 * linkgit:git-pull[1] and linkgit:git-fetch[1] from "origin"
01f49e34 118 to keep up-to-date with the upstream.
db9536c8 119
5162e697 120 * linkgit:git-push[1] to shared repository, if you adopt CVS
db9536c8
JH
121 style shared repository workflow.
122
5162e697 123 * linkgit:git-format-patch[1] to prepare e-mail submission, if
db9536c8
JH
124 you adopt Linux kernel-style public forum workflow.
125
44db136c
JH
126Examples
127~~~~~~~~
128
01f49e34 129Clone the upstream and work on it. Feed changes to upstream.::
1e2ccd3a 130+
44db136c
JH
131------------
132$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
133$ cd my2.6
134$ edit/compile/test; git commit -a -s <1>
1e2ccd3a 135$ git format-patch origin <2>
44db136c 136$ git pull <3>
119550af 137$ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <4>
180c4746
JH
138$ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <5>
139$ git reset --hard ORIG_HEAD <6>
208641cf 140$ git gc <7>
01f49e34 141$ git fetch --tags <8>
48aeecdc
SE
142------------
143+
44db136c
JH
144<1> repeat as needed.
145<2> extract patches from your branch for e-mail submission.
268b827d 146<3> `git pull` fetches from `origin` by default and merges into the
d808111e
JH
147current branch.
148<4> immediately after pulling, look at the changes done upstream
149since last time we checked, only in the
180c4746 150area we are interested in.
d808111e 151<5> fetch from a specific branch from a specific repository and merge.
180c4746
JH
152<6> revert the pull.
153<7> garbage collect leftover objects from reverted pull.
268b827d
JH
154<8> from time to time, obtain official tags from the `origin`
155and store them under `.git/refs/tags/`.
01f49e34
JH
156
157
158Push into another repository.::
159+
160------------
268b827d 161satellite$ git clone mothership:frotz frotz <1>
01f49e34 162satellite$ cd frotz
e0d10e1c 163satellite$ git config --get-regexp '^(remote|branch)\.' <2>
268b827d
JH
164remote.origin.url mothership:frotz
165remote.origin.fetch refs/heads/*:refs/remotes/origin/*
166branch.master.remote origin
167branch.master.merge refs/heads/master
e0d10e1c 168satellite$ git config remote.origin.push \
268b827d 169 master:refs/remotes/satellite/master <3>
01f49e34
JH
170satellite$ edit/compile/test/commit
171satellite$ git push origin <4>
172
173mothership$ cd frotz
174mothership$ git checkout master
268b827d 175mothership$ git merge satellite/master <5>
48aeecdc
SE
176------------
177+
01f49e34
JH
178<1> mothership machine has a frotz repository under your home
179directory; clone from it to start a repository on the satellite
180machine.
268b827d
JH
181<2> clone sets these configuration variables by default.
182It arranges `git pull` to fetch and store the branches of mothership
bc6dafc1 183machine to local `remotes/origin/*` remote-tracking branches.
268b827d
JH
184<3> arrange `git push` to push local `master` branch to
185`remotes/satellite/master` branch of the mothership machine.
186<4> push will stash our work away on `remotes/satellite/master`
bc6dafc1
MM
187remote-tracking branch on the mothership machine. You could use this
188as a back-up method.
01f49e34
JH
189<5> on mothership machine, merge the work done on the satellite
190machine into the master branch.
44db136c 191
01f49e34 192Branch off of a specific tag.::
1e2ccd3a 193+
44db136c
JH
194------------
195$ git checkout -b private2.6.14 v2.6.14 <1>
196$ edit/compile/test; git commit -a
197$ git checkout master
198$ git format-patch -k -m --stdout v2.6.14..private2.6.14 |
199 git am -3 -k <2>
48aeecdc
SE
200------------
201+
44db136c
JH
202<1> create a private branch based on a well known (but somewhat behind)
203tag.
268b827d 204<2> forward port all changes in `private2.6.14` branch to `master` branch
180c4746 205without a formal "merging".
44db136c
JH
206
207
db9536c8
JH
208Integrator[[Integrator]]
209------------------------
210
211A fairly central person acting as the integrator in a group
212project receives changes made by others, reviews and integrates
213them and publishes the result for others to use, using these
214commands in addition to the ones needed by participants.
215
5162e697 216 * linkgit:git-am[1] to apply patches e-mailed in from your
db9536c8
JH
217 contributors.
218
5162e697 219 * linkgit:git-pull[1] to merge from your trusted lieutenants.
db9536c8 220
5162e697 221 * linkgit:git-format-patch[1] to prepare and send suggested
db9536c8
JH
222 alternative to contributors.
223
5162e697 224 * linkgit:git-revert[1] to undo botched commits.
db9536c8 225
5162e697 226 * linkgit:git-push[1] to publish the bleeding edge.
db9536c8
JH
227
228
180c4746
JH
229Examples
230~~~~~~~~
231
01f49e34 232My typical GIT day.::
1e2ccd3a 233+
180c4746
JH
234------------
235$ git status <1>
236$ git show-branch <2>
237$ mailx <3>
238& s 2 3 4 5 ./+to-apply
239& s 7 8 ./+hold-linus
240& q
268b827d 241$ git checkout -b topic/one master
180c4746
JH
242$ git am -3 -i -s -u ./+to-apply <4>
243$ compile/test
244$ git checkout -b hold/linus && git am -3 -i -s -u ./+hold-linus <5>
1e2ccd3a 245$ git checkout topic/one && git rebase master <6>
268b827d
JH
246$ git checkout pu && git reset --hard next <7>
247$ git merge topic/one topic/two && git merge hold/linus <8>
180c4746 248$ git checkout maint
01f49e34 249$ git cherry-pick master~4 <9>
180c4746 250$ compile/test
d336fc09 251$ git tag -s -m "GIT 0.99.9x" v0.99.9x <10>
01f49e34
JH
252$ git fetch ko && git show-branch master maint 'tags/ko-*' <11>
253$ git push ko <12>
1e2ccd3a 254$ git push ko v0.99.9x <13>
48aeecdc
SE
255------------
256+
180c4746
JH
257<1> see what I was in the middle of doing, if any.
258<2> see what topic branches I have and think about how ready
259they are.
260<3> read mails, save ones that are applicable, and save others
261that are not quite ready.
262<4> apply them, interactively, with my sign-offs.
263<5> create topic branch as needed and apply, again with my
268b827d 264sign-offs.
1e2ccd3a
JH
265<6> rebase internal topic branch that has not been merged to the
266master, nor exposed as a part of a stable branch.
268b827d 267<7> restart `pu` every time from the next.
1e2ccd3a 268<8> and bundle topic branches still cooking.
01f49e34
JH
269<9> backport a critical fix.
270<10> create a signed tag.
d808111e 271<11> make sure I did not accidentally rewind master beyond what I
268b827d 272already pushed out. `ko` shorthand points at the repository I have
01f49e34 273at kernel.org, and looks like this:
53bcf78a
HB
274+
275------------
276$ cat .git/remotes/ko
277URL: kernel.org:/pub/scm/git/git.git
278Pull: master:refs/tags/ko-master
268b827d 279Pull: next:refs/tags/ko-next
53bcf78a
HB
280Pull: maint:refs/tags/ko-maint
281Push: master
268b827d 282Push: next
53bcf78a
HB
283Push: +pu
284Push: maint
285------------
286+
268b827d
JH
287In the output from `git show-branch`, `master` should have
288everything `ko-master` has, and `next` should have
289everything `ko-next` has.
53bcf78a 290
01f49e34
JH
291<12> push out the bleeding edge.
292<13> push the tag out, too.
180c4746
JH
293
294
db9536c8
JH
295Repository Administration[[Repository Administration]]
296------------------------------------------------------
297
298A repository administrator uses the following tools to set up
299and maintain access to the repository by developers.
300
5162e697 301 * linkgit:git-daemon[1] to allow anonymous download from
db9536c8
JH
302 repository.
303
5162e697 304 * linkgit:git-shell[1] can be used as a 'restricted login shell'
db9536c8
JH
305 for shared central repository users.
306
d808111e
JH
307link:howto/update-hook-example.txt[update hook howto] has a good
308example of managing a shared central repository.
db9536c8 309
1e2ccd3a
JH
310
311Examples
312~~~~~~~~
f8a5da6d
CC
313We assume the following in /etc/services::
314+
315------------
316$ grep 9418 /etc/services
317git 9418/tcp # Git Version Control System
318------------
319
01f49e34 320Run git-daemon to serve /pub/scm from inetd.::
1e2ccd3a
JH
321+
322------------
7872b188 323$ grep git /etc/inetd.conf
01f49e34 324git stream tcp nowait nobody \
d9c04ba3 325 /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
1e2ccd3a 326------------
01f49e34
JH
327+
328The actual configuration line should be on one line.
1e2ccd3a 329
c51901de
HB
330Run git-daemon to serve /pub/scm from xinetd.::
331+
332------------
333$ cat /etc/xinetd.d/git-daemon
334# default: off
335# description: The git server offers access to git repositories
336service git
337{
338 disable = no
339 type = UNLISTED
340 port = 9418
341 socket_type = stream
342 wait = no
343 user = nobody
344 server = /usr/bin/git-daemon
d9c04ba3 345 server_args = --inetd --export-all --base-path=/pub/scm
c51901de
HB
346 log_on_failure += USERID
347}
348------------
349+
350Check your xinetd(8) documentation and setup, this is from a Fedora system.
351Others might be different.
352
01f49e34 353Give push/pull only access to developers.::
1e2ccd3a
JH
354+
355------------
01f49e34 356$ grep git /etc/passwd <1>
1e2ccd3a
JH
357alice:x:1000:1000::/home/alice:/usr/bin/git-shell
358bob:x:1001:1001::/home/bob:/usr/bin/git-shell
359cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
360david:x:1003:1003::/home/david:/usr/bin/git-shell
01f49e34
JH
361$ grep git /etc/shells <2>
362/usr/bin/git-shell
48aeecdc
SE
363------------
364+
01f49e34 365<1> log-in shell is set to /usr/bin/git-shell, which does not
268b827d 366allow anything but `git push` and `git pull`. The users should
01f49e34
JH
367get an ssh access to the machine.
368<2> in many distributions /etc/shells needs to list what is used
369as the login shell.
01f49e34
JH
370
371CVS-style shared repository.::
372+
373------------
374$ grep git /etc/group <1>
375git:x:9418:alice,bob,cindy,david
376$ cd /home/devo.git
377$ ls -l <2>
378 lrwxrwxrwx 1 david git 17 Dec 4 22:40 HEAD -> refs/heads/master
379 drwxrwsr-x 2 david git 4096 Dec 4 22:40 branches
380 -rw-rw-r-- 1 david git 84 Dec 4 22:40 config
381 -rw-rw-r-- 1 david git 58 Dec 4 22:40 description
382 drwxrwsr-x 2 david git 4096 Dec 4 22:40 hooks
383 -rw-rw-r-- 1 david git 37504 Dec 4 22:40 index
384 drwxrwsr-x 2 david git 4096 Dec 4 22:40 info
385 drwxrwsr-x 4 david git 4096 Dec 4 22:40 objects
386 drwxrwsr-x 4 david git 4096 Nov 7 14:58 refs
387 drwxrwsr-x 2 david git 4096 Dec 4 22:40 remotes
388$ ls -l hooks/update <3>
389 -r-xr-xr-x 1 david git 3536 Dec 4 22:40 update
390$ cat info/allowed-users <4>
391refs/heads/master alice\|cindy
392refs/heads/doc-update bob
393refs/tags/v[0-9]* david
48aeecdc
SE
394------------
395+
01f49e34
JH
396<1> place the developers into the same git group.
397<2> and make the shared repository writable by the group.
398<3> use update-hook example by Carl from Documentation/howto/
399for branch policy control.
400<4> alice and cindy can push into master, only bob can push into doc-update.
401david is the release manager and is the only person who can
402create and push version tags.
80248b2e
JH
403
404HTTP server to support dumb protocol transfer.::
405+
406------------
407dev$ git update-server-info <1>
408dev$ ftp user@isp.example.com <2>
409ftp> cp -r .git /home/user/myproject.git
48aeecdc
SE
410------------
411+
80248b2e
JH
412<1> make sure your info/refs and objects/info/packs are up-to-date
413<2> upload to public HTTP server hosted by your ISP.