1 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3 <html xmlns=
"http://www.w3.org/1999/xhtml" xml:
lang=
"en">
5 <meta http-equiv=
"Content-Type" content=
"text/html; charset=UTF-8" />
6 <meta name=
"generator" content=
"AsciiDoc 8.2.5" />
7 <style type=
"text/css">
9 p
, li
, dt
, dd
, div
, pre
, h1
, h2
, h3
, h4
, h5
, h6
{
11 border: 1px solid red;
16 margin: 1em 5% 1em 5%;
21 text-decoration: underline
;
39 h1
, h2
, h3
, h4
, h5
, h6
{
41 font-family: sans-serif
;
48 border-bottom: 2px solid silver
;
66 border: 1px solid silver
;
81 font-family: sans-serif
;
88 font-family: sans-serif
;
92 font-family: sans-serif
;
94 border-top: 2px solid silver
;
100 padding-bottom: 0.5em;
104 padding-bottom: 0.5em;
108 div
.tableblock
, div
.imageblock
, div
.exampleblock
, div
.verseblock
,
109 div
.quoteblock
, div
.literalblock
, div
.listingblock
, div
.sidebarblock
,
110 div
.admonitionblock
{
113 margin-bottom: 1.5em;
115 div
.admonitionblock
{
117 margin-bottom: 2.5em;
120 div
.content
{ /* Block element content. */
124 /* Block element titles. */
125 div
.title
, caption
.title
{
126 font-family: sans-serif
;
130 margin-bottom: 0.5em;
136 td div
.title:first-child
{
139 div
.content div
.title:first-child
{
142 div
.content
+ div
.title
{
146 div
.sidebarblock
> div
.content
{
148 border: 1px solid silver
;
155 div
.listingblock
> div
.content
{
156 border: 1px solid silver
;
161 div
.quoteblock
> div
.content
{
168 div
.verseblock
+ div
.attribution
{
172 div
.admonitionblock
.icon
{
176 text-decoration: underline
;
178 padding-right: 0.5em;
180 div
.admonitionblock td
.content
{
182 border-left: 2px solid silver
;
185 div
.exampleblock
> div
.content
{
186 border-left: 2px solid silver
;
190 div
.verseblock div
.content
{
194 div
.imageblock div
.content
{ padding-left: 0; }
195 div
.imageblock img
{ border: 1px solid silver
; }
196 span
.image img
{ border-style: none
; }
200 margin-bottom: 0.8em;
212 list-style-position: outside
;
215 list-style-type: lower-alpha
;
218 div
.tableblock
> table
{
219 border: 3px solid
#527bbd;
222 font-family: sans-serif
;
231 margin-bottom: 0.8em;
239 padding-right: 0.8em;
246 div#footer-badges
{ display: none
; }
251 font-family: sans-serif
;
255 margin-bottom: 0.1em;
258 div
.toclevel1
, div
.toclevel2
, div
.toclevel3
, div
.toclevel4
{
274 /* Workarounds for IE6's broken and incomplete CSS2. */
276 div
.sidebar-content
{
278 border: 1px solid silver
;
281 div
.sidebar-title
, div
.image-title
{
282 font-family: sans-serif
;
285 margin-bottom: 0.5em;
288 div
.listingblock div
.content
{
289 border: 1px solid silver
;
294 div
.quoteblock-content
{
298 div
.exampleblock-content
{
299 border-left: 2px solid silver
;
303 /* IE6 sets dynamically generated links as visited. */
304 div#toc
a:visited
{ color: blue
; }
306 <title>Everyday GIT With
20 Commands Or So
</title>
310 <h1>Everyday GIT With
20 Commands Or So
</h1>
313 <div class=
"sectionbody">
314 <div class=
"para"><p><a href=
"#Basic Repository">[Basic Repository]
</a> commands are needed by people who have a
315 repository --- that is everybody, because every working tree of
316 git is a repository.
</p></div>
317 <div class=
"para"><p>In addition,
<a href=
"#Individual Developer (Standalone)">[Individual Developer (Standalone)]
</a> commands are
318 essential for anybody who makes a commit, even for somebody who
319 works alone.
</p></div>
320 <div class=
"para"><p>If you work with other people, you will need commands listed in
321 the
<a href=
"#Individual Developer (Participant)">[Individual Developer (Participant)]
</a> section as well.
</p></div>
322 <div class=
"para"><p>People who play the
<a href=
"#Integrator">[Integrator]
</a> role need to learn some more
323 commands in addition to the above.
</p></div>
324 <div class=
"para"><p><a href=
"#Repository Administration">[Repository Administration]
</a> commands are for system
325 administrators who are responsible for the care and feeding
326 of git repositories.
</p></div>
329 <h2 id=
"_basic_repository_a_id_basic_repository_a">Basic Repository
<a id=
"Basic Repository"></a></h2>
330 <div class=
"sectionbody">
331 <div class=
"para"><p>Everybody uses these commands to maintain git repositories.
</p></div>
332 <div class=
"ilist"><ul>
335 <a href=
"git-init.html">git-init(
1)
</a> or
<a href=
"git-clone.html">git-clone(
1)
</a> to create a
341 <a href=
"git-fsck.html">git-fsck(
1)
</a> to check the repository for errors.
346 <a href=
"git-gc.html">git-gc(
1)
</a> to do common housekeeping tasks such as
351 <h3 id=
"_examples">Examples
</h3><div style=
"clear:left"></div>
352 <div class=
"vlist"><dl>
354 Check health and remove cruft.
357 <div class=
"listingblock">
358 <div class=
"content">
359 <pre><tt>$ git fsck
<b>(
1)
</b>
360 $ git count-objects
<b>(
2)
</b>
361 $ git gc
<b>(
3)
</b></tt></pre>
363 <div class=
"colist"><ol>
366 running without
<tt>--full
</tt> is usually cheap and assures the
367 repository health reasonably well.
372 check how many loose objects there are and how much
373 disk space is wasted by not repacking.
378 repacks the local repository and performs other housekeeping tasks.
384 Repack a small project into single pack.
387 <div class=
"listingblock">
388 <div class=
"content">
389 <pre><tt>$ git gc
<b>(
1)
</b></tt></pre>
391 <div class=
"colist"><ol>
394 pack all the objects reachable from the refs into one pack,
395 then remove the other packs.
402 <h2 id=
"_individual_developer_standalone_a_id_individual_developer_standalone_a">Individual Developer (Standalone)
<a id=
"Individual Developer (Standalone)"></a></h2>
403 <div class=
"sectionbody">
404 <div class=
"para"><p>A standalone individual developer does not exchange patches with
405 other people, and works alone in a single repository, using the
406 following commands.
</p></div>
407 <div class=
"ilist"><ul>
410 <a href=
"git-show-branch.html">git-show-branch(
1)
</a> to see where you are.
415 <a href=
"git-log.html">git-log(
1)
</a> to see what happened.
420 <a href=
"git-checkout.html">git-checkout(
1)
</a> and
<a href=
"git-branch.html">git-branch(
1)
</a> to switch
426 <a href=
"git-add.html">git-add(
1)
</a> to manage the index file.
431 <a href=
"git-diff.html">git-diff(
1)
</a> and
<a href=
"git-status.html">git-status(
1)
</a> to see what
432 you are in the middle of doing.
437 <a href=
"git-commit.html">git-commit(
1)
</a> to advance the current branch.
442 <a href=
"git-reset.html">git-reset(
1)
</a> and
<a href=
"git-checkout.html">git-checkout(
1)
</a> (with
443 pathname parameters) to undo changes.
448 <a href=
"git-merge.html">git-merge(
1)
</a> to merge between local branches.
453 <a href=
"git-rebase.html">git-rebase(
1)
</a> to maintain topic branches.
458 <a href=
"git-tag.html">git-tag(
1)
</a> to mark known point.
462 <h3 id=
"_examples_2">Examples
</h3><div style=
"clear:left"></div>
463 <div class=
"vlist"><dl>
465 Use a tarball as a starting point for a new repository.
468 <div class=
"listingblock">
469 <div class=
"content">
470 <pre><tt>$ tar zxf frotz.tar.gz
473 $ git add .
<b>(
1)
</b>
474 $ git commit -m
"import of frotz source tree."
475 $ git tag v2.43
<b>(
2)
</b></tt></pre>
477 <div class=
"colist"><ol>
480 add everything under the current directory.
485 make a lightweight, unannotated tag.
491 Create a topic branch and develop.
494 <div class=
"listingblock">
495 <div class=
"content">
496 <pre><tt>$ git checkout -b alsa-audio
<b>(
1)
</b>
498 $ git checkout -- curses/ux_audio_oss.c
<b>(
2)
</b>
499 $ git add curses/ux_audio_alsa.c
<b>(
3)
</b>
501 $ git diff HEAD
<b>(
4)
</b>
502 $ git commit -a -s
<b>(
5)
</b>
504 $ git reset --soft HEAD^
<b>(
6)
</b>
506 $ git diff ORIG_HEAD
<b>(
7)
</b>
507 $ git commit -a -c ORIG_HEAD
<b>(
8)
</b>
508 $ git checkout master
<b>(
9)
</b>
509 $ git merge alsa-audio
<b>(
10)
</b>
510 $ git log --since='
3 days ago'
<b>(
11)
</b>
511 $ git log v2.43.. curses/
<b>(
12)
</b></tt></pre>
513 <div class=
"colist"><ol>
516 create a new topic branch.
521 revert your botched changes in
<tt>curses/ux_audio_oss.c
</tt>.
526 you need to tell git if you added a new file; removal and
527 modification will be caught if you do
<tt>git commit -a
</tt> later.
532 to see what changes you are committing.
537 commit everything as you have tested, with your sign-off.
542 take the last commit back, keeping what is in the working tree.
547 look at the changes since the premature commit we took back.
552 redo the commit undone in the previous step, using the message
553 you originally wrote.
558 switch to the master branch.
563 merge a topic branch into your master branch.
568 review commit logs; other forms to limit output can be
569 combined and include
<tt>--max-count=
10</tt> (show
10 commits),
570 <tt>--until=
2005-
12-
10</tt>, etc.
575 view only the changes that touch what's in
<tt>curses/
</tt>
576 directory, since
<tt>v2.43
</tt> tag.
583 <h2 id=
"_individual_developer_participant_a_id_individual_developer_participant_a">Individual Developer (Participant)
<a id=
"Individual Developer (Participant)"></a></h2>
584 <div class=
"sectionbody">
585 <div class=
"para"><p>A developer working as a participant in a group project needs to
586 learn how to communicate with others, and uses these commands in
587 addition to the ones needed by a standalone developer.
</p></div>
588 <div class=
"ilist"><ul>
591 <a href=
"git-clone.html">git-clone(
1)
</a> from the upstream to prime your local
597 <a href=
"git-pull.html">git-pull(
1)
</a> and
<a href=
"git-fetch.html">git-fetch(
1)
</a> from
"origin"
598 to keep up-to-date with the upstream.
603 <a href=
"git-push.html">git-push(
1)
</a> to shared repository, if you adopt CVS
604 style shared repository workflow.
609 <a href=
"git-format-patch.html">git-format-patch(
1)
</a> to prepare e-mail submission, if
610 you adopt Linux kernel-style public forum workflow.
614 <h3 id=
"_examples_3">Examples
</h3><div style=
"clear:left"></div>
615 <div class=
"vlist"><dl>
617 Clone the upstream and work on it. Feed changes to upstream.
620 <div class=
"listingblock">
621 <div class=
"content">
622 <pre><tt>$ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-
2.6 my2.6
624 $ edit/compile/test; git commit -a -s
<b>(
1)
</b>
625 $ git format-patch origin
<b>(
2)
</b>
626 $ git pull
<b>(
3)
</b>
627 $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386
<b>(
4)
</b>
628 $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL
<b>(
5)
</b>
629 $ git reset --hard ORIG_HEAD
<b>(
6)
</b>
631 $ git fetch --tags
<b>(
8)
</b></tt></pre>
633 <div class=
"colist"><ol>
641 extract patches from your branch for e-mail submission.
646 <tt>git pull
</tt> fetches from
<tt>origin
</tt> by default and merges into the
652 immediately after pulling, look at the changes done upstream
653 since last time we checked, only in the
654 area we are interested in.
659 fetch from a specific branch from a specific repository and merge.
669 garbage collect leftover objects from reverted pull.
674 from time to time, obtain official tags from the
<tt>origin
</tt>
675 and store them under
<tt>.git/refs/tags/
</tt>.
681 Push into another repository.
684 <div class=
"listingblock">
685 <div class=
"content">
686 <pre><tt>satellite$ git clone mothership:frotz frotz
<b>(
1)
</b>
688 satellite$ git config --get-regexp '^(remote|branch)\.'
<b>(
2)
</b>
689 remote.origin.url mothership:frotz
690 remote.origin.fetch refs/heads/*:refs/remotes/origin/*
691 branch.master.remote origin
692 branch.master.merge refs/heads/master
693 satellite$ git config remote.origin.push \
694 master:refs/remotes/satellite/master
<b>(
3)
</b>
695 satellite$ edit/compile/test/commit
696 satellite$ git push origin
<b>(
4)
</b>
699 mothership$ git checkout master
700 mothership$ git merge satellite/master
<b>(
5)
</b></tt></pre>
702 <div class=
"colist"><ol>
705 mothership machine has a frotz repository under your home
706 directory; clone from it to start a repository on the satellite
712 clone sets these configuration variables by default.
713 It arranges
<tt>git pull
</tt> to fetch and store the branches of mothership
714 machine to local
<tt>remotes/origin/*
</tt> tracking branches.
719 arrange
<tt>git push
</tt> to push local
<tt>master
</tt> branch to
720 <tt>remotes/satellite/master
</tt> branch of the mothership machine.
725 push will stash our work away on
<tt>remotes/satellite/master
</tt>
726 tracking branch on the mothership machine. You could use this as
732 on mothership machine, merge the work done on the satellite
733 machine into the master branch.
739 Branch off of a specific tag.
742 <div class=
"listingblock">
743 <div class=
"content">
744 <pre><tt>$ git checkout -b private2.6
.14 v2.6
.14 <b>(
1)
</b>
745 $ edit/compile/test; git commit -a
746 $ git checkout master
747 $ git format-patch -k -m --stdout v2.6
.14..private2.6
.14 |
748 git am -
3 -k
<b>(
2)
</b></tt></pre>
750 <div class=
"colist"><ol>
753 create a private branch based on a well known (but somewhat behind)
759 forward port all changes in
<tt>private2.6
.14</tt> branch to
<tt>master
</tt> branch
760 without a formal
"merging".
767 <h2 id=
"_integrator_a_id_integrator_a">Integrator
<a id=
"Integrator"></a></h2>
768 <div class=
"sectionbody">
769 <div class=
"para"><p>A fairly central person acting as the integrator in a group
770 project receives changes made by others, reviews and integrates
771 them and publishes the result for others to use, using these
772 commands in addition to the ones needed by participants.
</p></div>
773 <div class=
"ilist"><ul>
776 <a href=
"git-am.html">git-am(
1)
</a> to apply patches e-mailed in from your
782 <a href=
"git-pull.html">git-pull(
1)
</a> to merge from your trusted lieutenants.
787 <a href=
"git-format-patch.html">git-format-patch(
1)
</a> to prepare and send suggested
788 alternative to contributors.
793 <a href=
"git-revert.html">git-revert(
1)
</a> to undo botched commits.
798 <a href=
"git-push.html">git-push(
1)
</a> to publish the bleeding edge.
802 <h3 id=
"_examples_4">Examples
</h3><div style=
"clear:left"></div>
803 <div class=
"vlist"><dl>
808 <div class=
"listingblock">
809 <div class=
"content">
810 <pre><tt>$ git status
<b>(
1)
</b>
811 $ git show-branch
<b>(
2)
</b>
813 & s
2 3 4 5 ./+to-apply
814 & s
7 8 ./+hold-linus
816 $ git checkout -b topic/one master
817 $ git am -
3 -i -s -u ./+to-apply
<b>(
4)
</b>
819 $ git checkout -b hold/linus
&& git am -
3 -i -s -u ./+hold-linus
<b>(
5)
</b>
820 $ git checkout topic/one
&& git rebase master
<b>(
6)
</b>
821 $ git checkout pu
&& git reset --hard next
<b>(
7)
</b>
822 $ git merge topic/one topic/two
&& git merge hold/linus
<b>(
8)
</b>
824 $ git cherry-pick master~
4 <b>(
9)
</b>
826 $ git tag -s -m
"GIT 0.99.9x" v0.99
.9x
<b>(
10)
</b>
827 $ git fetch ko
&& git show-branch master maint 'tags/ko-*'
<b>(
11)
</b>
828 $ git push ko
<b>(
12)
</b>
829 $ git push ko v0.99
.9x
<b>(
13)
</b></tt></pre>
831 <div class=
"colist"><ol>
834 see what I was in the middle of doing, if any.
839 see what topic branches I have and think about how ready
845 read mails, save ones that are applicable, and save others
846 that are not quite ready.
851 apply them, interactively, with my sign-offs.
856 create topic branch as needed and apply, again with my
862 rebase internal topic branch that has not been merged to the
863 master, nor exposed as a part of a stable branch.
868 restart
<tt>pu
</tt> every time from the next.
873 and bundle topic branches still cooking.
878 backport a critical fix.
888 make sure I did not accidentally rewind master beyond what I
889 already pushed out.
<tt>ko
</tt> shorthand points at the repository I have
890 at kernel.org, and looks like this:
892 <div class=
"listingblock">
893 <div class=
"content">
894 <pre><tt>$ cat .git/remotes/ko
895 URL: kernel.org:/pub/scm/git/git.git
896 Pull: master:refs/tags/ko-master
897 Pull: next:refs/tags/ko-next
898 Pull: maint:refs/tags/ko-maint
902 Push: maint
</tt></pre>
904 <div class=
"para"><p>In the output from
<tt>git show-branch
</tt>,
<tt>master
</tt> should have
905 everything
<tt>ko-master
</tt> has, and
<tt>next
</tt> should have
906 everything
<tt>ko-next
</tt> has.
</p></div>
910 push out the bleeding edge.
915 push the tag out, too.
922 <h2 id=
"_repository_administration_a_id_repository_administration_a">Repository Administration
<a id=
"Repository Administration"></a></h2>
923 <div class=
"sectionbody">
924 <div class=
"para"><p>A repository administrator uses the following tools to set up
925 and maintain access to the repository by developers.
</p></div>
926 <div class=
"ilist"><ul>
929 <a href=
"git-daemon.html">git-daemon(
1)
</a> to allow anonymous download from
935 <a href=
"git-shell.html">git-shell(
1)
</a> can be used as a
<em>restricted login shell
</em>
936 for shared central repository users.
940 <div class=
"para"><p><a href=
"howto/update-hook-example.txt">update hook howto
</a> has a good
941 example of managing a shared central repository.
</p></div>
942 <h3 id=
"_examples_5">Examples
</h3><div style=
"clear:left"></div>
943 <div class=
"vlist"><dl>
945 We assume the following in /etc/services
948 <div class=
"listingblock">
949 <div class=
"content">
950 <pre><tt>$ grep
9418 /etc/services
951 git
9418/tcp # Git Version Control System
</tt></pre>
955 Run git-daemon to serve /pub/scm from inetd.
958 <div class=
"listingblock">
959 <div class=
"content">
960 <pre><tt>$ grep git /etc/inetd.conf
961 git stream tcp nowait nobody \
962 /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
</tt></pre>
964 <div class=
"para"><p>The actual configuration line should be on one line.
</p></div>
967 Run git-daemon to serve /pub/scm from xinetd.
970 <div class=
"listingblock">
971 <div class=
"content">
972 <pre><tt>$ cat /etc/xinetd.d/git-daemon
974 # description: The git server offers access to git repositories
983 server = /usr/bin/git-daemon
984 server_args = --inetd --export-all --base-path=/pub/scm
985 log_on_failure += USERID
988 <div class=
"para"><p>Check your xinetd(
8) documentation and setup, this is from a Fedora system.
989 Others might be different.
</p></div>
992 Give push/pull only access to developers.
995 <div class=
"listingblock">
996 <div class=
"content">
997 <pre><tt>$ grep git /etc/passwd
<b>(
1)
</b>
998 alice:x:
1000:
1000::/home/alice:/usr/bin/git-shell
999 bob:x:
1001:
1001::/home/bob:/usr/bin/git-shell
1000 cindy:x:
1002:
1002::/home/cindy:/usr/bin/git-shell
1001 david:x:
1003:
1003::/home/david:/usr/bin/git-shell
1002 $ grep git /etc/shells
<b>(
2)
</b>
1003 /usr/bin/git-shell
</tt></pre>
1005 <div class=
"colist"><ol>
1008 log-in shell is set to /usr/bin/git-shell, which does not
1009 allow anything but
<tt>git push
</tt> and
<tt>git pull
</tt>. The users should
1010 get an ssh access to the machine.
1015 in many distributions /etc/shells needs to list what is used
1022 CVS-style shared repository.
1025 <div class=
"listingblock">
1026 <div class=
"content">
1027 <pre><tt>$ grep git /etc/group
<b>(
1)
</b>
1028 git:x:
9418:alice,bob,cindy,david
1031 lrwxrwxrwx
1 david git
17 Dec
4 22:
40 HEAD -
> refs/heads/master
1032 drwxrwsr-x
2 david git
4096 Dec
4 22:
40 branches
1033 -rw-rw-r--
1 david git
84 Dec
4 22:
40 config
1034 -rw-rw-r--
1 david git
58 Dec
4 22:
40 description
1035 drwxrwsr-x
2 david git
4096 Dec
4 22:
40 hooks
1036 -rw-rw-r--
1 david git
37504 Dec
4 22:
40 index
1037 drwxrwsr-x
2 david git
4096 Dec
4 22:
40 info
1038 drwxrwsr-x
4 david git
4096 Dec
4 22:
40 objects
1039 drwxrwsr-x
4 david git
4096 Nov
7 14:
58 refs
1040 drwxrwsr-x
2 david git
4096 Dec
4 22:
40 remotes
1041 $ ls -l hooks/update
<b>(
3)
</b>
1042 -r-xr-xr-x
1 david git
3536 Dec
4 22:
40 update
1043 $ cat info/allowed-users
<b>(
4)
</b>
1044 refs/heads/master alice\|cindy
1045 refs/heads/doc-update bob
1046 refs/tags/v[
0-
9]* david
</tt></pre>
1048 <div class=
"colist"><ol>
1051 place the developers into the same git group.
1056 and make the shared repository writable by the group.
1061 use update-hook example by Carl from Documentation/howto/
1062 for branch policy control.
1067 alice and cindy can push into master, only bob can push into doc-update.
1068 david is the release manager and is the only person who can
1069 create and push version tags.
1075 HTTP server to support dumb protocol transfer.
1078 <div class=
"listingblock">
1079 <div class=
"content">
1080 <pre><tt>dev$ git update-server-info
<b>(
1)
</b>
1081 dev$ ftp user@isp.example.com
<b>(
2)
</b>
1082 ftp
> cp -r .git /home/user/myproject.git
</tt></pre>
1084 <div class=
"colist"><ol>
1087 make sure your info/refs and objects/info/packs are up-to-date
1092 upload to public HTTP server hosted by your ISP.
1100 <div id=
"footer-text">
1101 Last updated
2010-
02-
13 01:
00:
05 UTC