455 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			455 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| giteveryday(7)
 | |
| ==============
 | |
| 
 | |
| NAME
 | |
| ----
 | |
| giteveryday - A useful minimum set of commands for Everyday Git
 | |
| 
 | |
| SYNOPSIS
 | |
| --------
 | |
| 
 | |
| Everyday Git With 20 Commands Or So
 | |
| 
 | |
| DESCRIPTION
 | |
| -----------
 | |
| 
 | |
| Git users can broadly be grouped into four categories for the purposes of
 | |
| describing here a small set of useful command for everyday Git.
 | |
| 
 | |
| *	<<STANDALONE,Individual Developer (Standalone)>> commands are essential
 | |
| 	for anybody who makes a commit, even for somebody who works alone.
 | |
| 
 | |
| *	If you work with other people, you will need commands listed in
 | |
| 	the <<PARTICIPANT,Individual Developer (Participant)>> section as well.
 | |
| 
 | |
| *	People who play the <<INTEGRATOR,Integrator>> role need to learn some
 | |
| 	more commands in addition to the above.
 | |
| 
 | |
| *	<<ADMINISTRATION,Repository Administration>> commands are for system
 | |
| 	administrators who are responsible for the care and feeding
 | |
| 	of Git repositories.
 | |
| 
 | |
| 
 | |
| Individual Developer (Standalone)[[STANDALONE]]
 | |
| -----------------------------------------------
 | |
| 
 | |
| A standalone individual developer does not exchange patches with
 | |
| other people, and works alone in a single repository, using the
 | |
| following commands.
 | |
| 
 | |
|   * linkgit:git-init[1] to create a new repository.
 | |
| 
 | |
|   * linkgit:git-log[1] to see what happened.
 | |
| 
 | |
|   * linkgit:git-switch[1] and linkgit:git-branch[1] to switch
 | |
|     branches.
 | |
| 
 | |
|   * linkgit:git-add[1] to manage the index file.
 | |
| 
 | |
|   * linkgit:git-diff[1] and linkgit:git-status[1] to see what
 | |
|     you are in the middle of doing.
 | |
| 
 | |
|   * linkgit:git-commit[1] to advance the current branch.
 | |
| 
 | |
|   * linkgit:git-restore[1] to undo changes.
 | |
| 
 | |
|   * linkgit:git-merge[1] to merge between local branches.
 | |
| 
 | |
|   * linkgit:git-rebase[1] to maintain topic branches.
 | |
| 
 | |
|   * linkgit:git-tag[1] to mark a known point.
 | |
| 
 | |
| Examples
 | |
| ~~~~~~~~
 | |
| 
 | |
| Use a tarball as a starting point for a new repository.::
 | |
| +
 | |
| ------------
 | |
| $ tar zxf frotz.tar.gz
 | |
| $ cd frotz
 | |
| $ git init
 | |
| $ git add . <1>
 | |
| $ git commit -m "import of frotz source tree."
 | |
| $ git tag v2.43 <2>
 | |
| ------------
 | |
| +
 | |
| <1> add everything under the current directory.
 | |
| <2> make a lightweight, unannotated tag.
 | |
| 
 | |
| Create a topic branch and develop.::
 | |
| +
 | |
| ------------
 | |
| $ git switch -c alsa-audio <1>
 | |
| $ edit/compile/test
 | |
| $ git restore curses/ux_audio_oss.c <2>
 | |
| $ git add curses/ux_audio_alsa.c <3>
 | |
| $ edit/compile/test
 | |
| $ git diff HEAD <4>
 | |
| $ git commit -a -s <5>
 | |
| $ edit/compile/test
 | |
| $ git diff HEAD^ <6>
 | |
| $ git commit -a --amend <7>
 | |
| $ git switch master <8>
 | |
| $ git merge alsa-audio <9>
 | |
| $ git log --since='3 days ago' <10>
 | |
| $ git log v2.43.. curses/ <11>
 | |
| ------------
 | |
| +
 | |
| <1> create a new topic branch.
 | |
| <2> revert your botched changes in `curses/ux_audio_oss.c`.
 | |
| <3> you need to tell Git if you added a new file; removal and
 | |
| modification will be caught if you do `git commit -a` later.
 | |
| <4> to see what changes you are committing.
 | |
| <5> commit everything, as you have tested, with your sign-off.
 | |
| <6> look at all your changes including the previous commit.
 | |
| <7> amend the previous commit, adding all your new changes,
 | |
| using your original message.
 | |
| <8> switch to the master branch.
 | |
| <9> merge a topic branch into your master branch.
 | |
| <10> review commit logs; other forms to limit output can be
 | |
| combined and include `-10` (to show up to 10 commits),
 | |
| `--until=2005-12-10`, etc.
 | |
| <11> view only the changes that touch what's in `curses/`
 | |
| directory, since `v2.43` tag.
 | |
| 
 | |
| 
 | |
| Individual Developer (Participant)[[PARTICIPANT]]
 | |
| -------------------------------------------------
 | |
| 
 | |
| A developer working as a participant in a group project needs to
 | |
| learn how to communicate with others, and uses these commands in
 | |
| addition to the ones needed by a standalone developer.
 | |
| 
 | |
|   * linkgit:git-clone[1] from the upstream to prime your local
 | |
|     repository.
 | |
| 
 | |
|   * linkgit:git-pull[1] and linkgit:git-fetch[1] from "origin"
 | |
|     to keep up-to-date with the upstream.
 | |
| 
 | |
|   * linkgit:git-push[1] to shared repository, if you adopt CVS
 | |
|     style shared repository workflow.
 | |
| 
 | |
|   * linkgit:git-format-patch[1] to prepare e-mail submission, if
 | |
|     you adopt Linux kernel-style public forum workflow.
 | |
| 
 | |
|   * linkgit:git-send-email[1] to send your e-mail submission without
 | |
|     corruption by your MUA.
 | |
| 
 | |
|   * linkgit:git-request-pull[1] to create a summary of changes
 | |
|     for your upstream to pull.
 | |
| 
 | |
| 
 | |
| Examples
 | |
| ~~~~~~~~
 | |
| 
 | |
| Clone the upstream and work on it.  Feed changes to upstream.::
 | |
| +
 | |
| ------------
 | |
| $ git clone git://git.kernel.org/pub/scm/.../torvalds/linux-2.6 my2.6
 | |
| $ cd my2.6
 | |
| $ git switch -c mine master <1>
 | |
| $ edit/compile/test; git commit -a -s <2>
 | |
| $ git format-patch master <3>
 | |
| $ git send-email --to="person <email@example.com>" 00*.patch <4>
 | |
| $ git switch master <5>
 | |
| $ git pull <6>
 | |
| $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <7>
 | |
| $ git ls-remote --heads http://git.kernel.org/.../jgarzik/libata-dev.git <8>
 | |
| $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <9>
 | |
| $ git reset --hard ORIG_HEAD <10>
 | |
| $ git gc <11>
 | |
| ------------
 | |
| +
 | |
| <1> checkout a new branch `mine` from master.
 | |
| <2> repeat as needed.
 | |
| <3> extract patches from your branch, relative to master,
 | |
| <4> and email them.
 | |
| <5> return to `master`, ready to see what's new
 | |
| <6> `git pull` fetches from `origin` by default and merges into the
 | |
| current branch.
 | |
| <7> immediately after pulling, look at the changes done upstream
 | |
| since last time we checked, only in the
 | |
| area we are interested in.
 | |
| <8> check the branch names in an external repository (if not known).
 | |
| <9> fetch from a specific branch `ALL` from a specific repository
 | |
| and merge it.
 | |
| <10> revert the pull.
 | |
| <11> garbage collect leftover objects from reverted pull.
 | |
| 
 | |
| 
 | |
| Push into another repository.::
 | |
| +
 | |
| ------------
 | |
| satellite$ git clone mothership:frotz frotz <1>
 | |
| satellite$ cd frotz
 | |
| satellite$ git config --get-regexp '^(remote|branch)\.' <2>
 | |
| remote.origin.url mothership:frotz
 | |
| remote.origin.fetch refs/heads/*:refs/remotes/origin/*
 | |
| branch.master.remote origin
 | |
| branch.master.merge refs/heads/master
 | |
| satellite$ git config remote.origin.push \
 | |
| 	   +refs/heads/*:refs/remotes/satellite/* <3>
 | |
| satellite$ edit/compile/test/commit
 | |
| satellite$ git push origin <4>
 | |
| 
 | |
| mothership$ cd frotz
 | |
| mothership$ git switch master
 | |
| mothership$ git merge satellite/master <5>
 | |
| ------------
 | |
| +
 | |
| <1> mothership machine has a frotz repository under your home
 | |
| directory; clone from it to start a repository on the satellite
 | |
| machine.
 | |
| <2> clone sets these configuration variables by default.
 | |
| It arranges `git pull` to fetch and store the branches of mothership
 | |
| machine to local `remotes/origin/*` remote-tracking branches.
 | |
| <3> arrange `git push` to push all local branches to
 | |
| their corresponding branch of the mothership machine.
 | |
| <4> push will stash all our work away on `remotes/satellite/*`
 | |
| remote-tracking branches on the mothership machine.  You could use this
 | |
| as a back-up method. Likewise, you can pretend that mothership
 | |
| "fetched" from you (useful when access is one sided).
 | |
| <5> on mothership machine, merge the work done on the satellite
 | |
| machine into the master branch.
 | |
| 
 | |
| Branch off of a specific tag.::
 | |
| +
 | |
| ------------
 | |
| $ git switch -c private2.6.14 v2.6.14 <1>
 | |
| $ edit/compile/test; git commit -a
 | |
| $ git checkout master
 | |
| $ git cherry-pick v2.6.14..private2.6.14 <2>
 | |
| ------------
 | |
| +
 | |
| <1> create a private branch based on a well known (but somewhat behind)
 | |
| tag.
 | |
| <2> forward port all changes in `private2.6.14` branch to `master` branch
 | |
| without a formal "merging". Or longhand +
 | |
| `git format-patch -k -m --stdout v2.6.14..private2.6.14 |
 | |
|   git am -3 -k`
 | |
| 
 | |
| An alternate participant submission mechanism is using the
 | |
| `git request-pull` or pull-request mechanisms (e.g as used on
 | |
| GitHub (www.github.com) to notify your upstream of your
 | |
| contribution.
 | |
| 
 | |
| Integrator[[INTEGRATOR]]
 | |
| ------------------------
 | |
| 
 | |
| A fairly central person acting as the integrator in a group
 | |
| project receives changes made by others, reviews and integrates
 | |
| them and publishes the result for others to use, using these
 | |
| commands in addition to the ones needed by participants.
 | |
| 
 | |
| This section can also be used by those who respond to `git
 | |
| request-pull` or pull-request on GitHub (www.github.com) to
 | |
| integrate the work of others into their history. A sub-area
 | |
| lieutenant for a repository will act both as a participant and
 | |
| as an integrator.
 | |
| 
 | |
| 
 | |
|   * linkgit:git-am[1] to apply patches e-mailed in from your
 | |
|     contributors.
 | |
| 
 | |
|   * linkgit:git-pull[1] to merge from your trusted lieutenants.
 | |
| 
 | |
|   * linkgit:git-format-patch[1] to prepare and send suggested
 | |
|     alternative to contributors.
 | |
| 
 | |
|   * linkgit:git-revert[1] to undo botched commits.
 | |
| 
 | |
|   * linkgit:git-push[1] to publish the bleeding edge.
 | |
| 
 | |
| 
 | |
| Examples
 | |
| ~~~~~~~~
 | |
| 
 | |
| A typical integrator's Git day.::
 | |
| +
 | |
| ------------
 | |
| $ git status <1>
 | |
| $ git branch --no-merged master <2>
 | |
| $ mailx <3>
 | |
| & s 2 3 4 5 ./+to-apply
 | |
| & s 7 8 ./+hold-linus
 | |
| & q
 | |
| $ git switch -c topic/one master
 | |
| $ git am -3 -i -s ./+to-apply <4>
 | |
| $ compile/test
 | |
| $ git switch -c hold/linus && git am -3 -i -s ./+hold-linus <5>
 | |
| $ git switch topic/one && git rebase master <6>
 | |
| $ git switch -C pu next <7>
 | |
| $ git merge topic/one topic/two && git merge hold/linus <8>
 | |
| $ git switch maint
 | |
| $ git cherry-pick master~4 <9>
 | |
| $ compile/test
 | |
| $ git tag -s -m "GIT 0.99.9x" v0.99.9x <10>
 | |
| $ git fetch ko && for branch in master maint next pu <11>
 | |
|     do
 | |
| 	git show-branch ko/$branch $branch <12>
 | |
|     done
 | |
| $ git push --follow-tags ko <13>
 | |
| ------------
 | |
| +
 | |
| <1> see what you were in the middle of doing, if anything.
 | |
| <2> see which branches haven't been merged into `master` yet.
 | |
| Likewise for any other integration branches e.g. `maint`, `next`
 | |
| and `pu` (potential updates).
 | |
| <3> read mails, save ones that are applicable, and save others
 | |
| that are not quite ready (other mail readers are available).
 | |
| <4> apply them, interactively, with your sign-offs.
 | |
| <5> create topic branch as needed and apply, again with sign-offs.
 | |
| <6> rebase internal topic branch that has not been merged to the
 | |
| master or exposed as a part of a stable branch.
 | |
| <7> restart `pu` every time from the next.
 | |
| <8> and bundle topic branches still cooking.
 | |
| <9> backport a critical fix.
 | |
| <10> create a signed tag.
 | |
| <11> make sure master was not accidentally rewound beyond that
 | |
| already pushed out.
 | |
| <12> In the output from `git show-branch`, `master` should have
 | |
| everything `ko/master` has, and `next` should have
 | |
| everything `ko/next` has, etc.
 | |
| <13> push out the bleeding edge, together with new tags that point
 | |
| into the pushed history.
 | |
| 
 | |
| In this example, the `ko` shorthand points at the Git maintainer's
 | |
| repository at kernel.org, and looks like this:
 | |
| 
 | |
| ------------
 | |
| (in .git/config)
 | |
| [remote "ko"]
 | |
| 	url = kernel.org:/pub/scm/git/git.git
 | |
| 	fetch = refs/heads/*:refs/remotes/ko/*
 | |
| 	push = refs/heads/master
 | |
| 	push = refs/heads/next
 | |
| 	push = +refs/heads/pu
 | |
| 	push = refs/heads/maint
 | |
| ------------
 | |
| 
 | |
| 
 | |
| Repository Administration[[ADMINISTRATION]]
 | |
| -------------------------------------------
 | |
| 
 | |
| A repository administrator uses the following tools to set up
 | |
| and maintain access to the repository by developers.
 | |
| 
 | |
|   * linkgit:git-daemon[1] to allow anonymous download from
 | |
|     repository.
 | |
| 
 | |
|   * linkgit:git-shell[1] can be used as a 'restricted login shell'
 | |
|     for shared central repository users.
 | |
| 
 | |
|   * linkgit:git-http-backend[1] provides a server side implementation
 | |
|     of Git-over-HTTP ("Smart http") allowing both fetch and push services.
 | |
| 
 | |
|   * linkgit:gitweb[1] provides a web front-end to Git repositories,
 | |
|     which can be set-up using the linkgit:git-instaweb[1] script.
 | |
| 
 | |
| link:howto/update-hook-example.html[update hook howto] has a good
 | |
| example of managing a shared central repository.
 | |
| 
 | |
| In addition there are a number of other widely deployed hosting, browsing
 | |
| and reviewing solutions such as:
 | |
| 
 | |
|   * gitolite, gerrit code review, cgit and others.
 | |
| 
 | |
| Examples
 | |
| ~~~~~~~~
 | |
| We assume the following in /etc/services::
 | |
| +
 | |
| ------------
 | |
| $ grep 9418 /etc/services
 | |
| git		9418/tcp		# Git Version Control System
 | |
| ------------
 | |
| 
 | |
| Run git-daemon to serve /pub/scm from inetd.::
 | |
| +
 | |
| ------------
 | |
| $ grep git /etc/inetd.conf
 | |
| git	stream	tcp	nowait	nobody \
 | |
|   /usr/bin/git-daemon git-daemon --inetd --export-all /pub/scm
 | |
| ------------
 | |
| +
 | |
| The actual configuration line should be on one line.
 | |
| 
 | |
| Run git-daemon to serve /pub/scm from xinetd.::
 | |
| +
 | |
| ------------
 | |
| $ cat /etc/xinetd.d/git-daemon
 | |
| # default: off
 | |
| # description: The Git server offers access to Git repositories
 | |
| service git
 | |
| {
 | |
| 	disable = no
 | |
| 	type            = UNLISTED
 | |
| 	port            = 9418
 | |
| 	socket_type     = stream
 | |
| 	wait            = no
 | |
| 	user            = nobody
 | |
| 	server          = /usr/bin/git-daemon
 | |
| 	server_args     = --inetd --export-all --base-path=/pub/scm
 | |
| 	log_on_failure  += USERID
 | |
| }
 | |
| ------------
 | |
| +
 | |
| Check your xinetd(8) documentation and setup, this is from a Fedora system.
 | |
| Others might be different.
 | |
| 
 | |
| Give push/pull only access to developers using git-over-ssh.::
 | |
| 
 | |
| e.g. those using:
 | |
| `$ git push/pull ssh://host.xz/pub/scm/project`
 | |
| +
 | |
| ------------
 | |
| $ grep git /etc/passwd <1>
 | |
| alice:x:1000:1000::/home/alice:/usr/bin/git-shell
 | |
| bob:x:1001:1001::/home/bob:/usr/bin/git-shell
 | |
| cindy:x:1002:1002::/home/cindy:/usr/bin/git-shell
 | |
| david:x:1003:1003::/home/david:/usr/bin/git-shell
 | |
| $ grep git /etc/shells <2>
 | |
| /usr/bin/git-shell
 | |
| ------------
 | |
| +
 | |
| <1> log-in shell is set to /usr/bin/git-shell, which does not
 | |
| allow anything but `git push` and `git pull`.  The users require
 | |
| ssh access to the machine.
 | |
| <2> in many distributions /etc/shells needs to list what is used
 | |
| as the login shell.
 | |
| 
 | |
| CVS-style shared repository.::
 | |
| +
 | |
| ------------
 | |
| $ grep git /etc/group <1>
 | |
| git:x:9418:alice,bob,cindy,david
 | |
| $ cd /home/devo.git
 | |
| $ ls -l <2>
 | |
|   lrwxrwxrwx   1 david git    17 Dec  4 22:40 HEAD -> refs/heads/master
 | |
|   drwxrwsr-x   2 david git  4096 Dec  4 22:40 branches
 | |
|   -rw-rw-r--   1 david git    84 Dec  4 22:40 config
 | |
|   -rw-rw-r--   1 david git    58 Dec  4 22:40 description
 | |
|   drwxrwsr-x   2 david git  4096 Dec  4 22:40 hooks
 | |
|   -rw-rw-r--   1 david git 37504 Dec  4 22:40 index
 | |
|   drwxrwsr-x   2 david git  4096 Dec  4 22:40 info
 | |
|   drwxrwsr-x   4 david git  4096 Dec  4 22:40 objects
 | |
|   drwxrwsr-x   4 david git  4096 Nov  7 14:58 refs
 | |
|   drwxrwsr-x   2 david git  4096 Dec  4 22:40 remotes
 | |
| $ ls -l hooks/update <3>
 | |
|   -r-xr-xr-x   1 david git  3536 Dec  4 22:40 update
 | |
| $ cat info/allowed-users <4>
 | |
| refs/heads/master	alice\|cindy
 | |
| refs/heads/doc-update	bob
 | |
| refs/tags/v[0-9]*	david
 | |
| ------------
 | |
| +
 | |
| <1> place the developers into the same git group.
 | |
| <2> and make the shared repository writable by the group.
 | |
| <3> use update-hook example by Carl from Documentation/howto/
 | |
| for branch policy control.
 | |
| <4> alice and cindy can push into master, only bob can push into doc-update.
 | |
| david is the release manager and is the only person who can
 | |
| create and push version tags.
 | |
| 
 | |
| GIT
 | |
| ---
 | |
| Part of the linkgit:git[1] suite
 |