Unix users: download and install using your package manager.
Microsoft Windows: download `git-for-windows
-<https://github.com/git-for-windows/git/releases>`_.
+<https://github.com/git-for-windows/git/releases>`_ or `msysGit
+<https://github.com/msysgit/msysgit/releases>`_.
MacOS X: use git installed with `XCode
-<https://developer.apple.com/xcode/downloads/>`_ or download
+<https://developer.apple.com/xcode/downloads/>`_ or download from
+`MacPorts <https://www.macports.org/ports.php?by=name&substr=git>`_ or
`git-osx-installer
-<http://sourceforge.net/projects/git-osx-installer/files/>`_.
+<http://sourceforge.net/projects/git-osx-installer/files/>`_ or
+install git with `Homebrew <http://brew.sh/>`_: ``brew install git``.
+
+`Atlassins's SourceTree <https://www.sourcetreeapp.com/>`_ is a free
+Git and Mercurial GUI client for Windows or Mac.
Initial configuration
---------------------
currently checked out branch is ``v2``. That is, it's assumed you have
done something like that::
+ $ git clone -b v2 http://git.python.org/python.git
+ $ cd python
+ $ git branch v1 origin/v1
+
+The last command creates a new local branch v1 and sets
+remotes/origin/v1 as its upstream remote branch.
+
+The same result can achieved with commands::
+
$ git clone -b v1 http://git.python.org/python.git
$ cd python
- $ git fetch origin v2:v2
- $ git checkout -b v2
+ $ git checkout --track origin/v2
+
+The last command creates a new local branch v2, sets
+remotes/origin/v2 as its upstream remote branch and checks it out into
+the working directory.
Branches and branches
$ git clone -b v1 http://git.python.org/python.git
git clones remote repository ``http://git.python.org/python.git`` to
-directory ``python``, creates remote branches and checks out branch
-``v1`` into the working directory.
+directory ``python``, creates remote branches, creates a local branch
+``v1``, configure it to track upstream remotes/origin/v1 branch and
+checks out ``v1`` into the working directory.
Updating local and remote branches
----------------------------------
You really should push only to bare repositories. For non-bare
repositories git prefers pull-based workflow.
+When you want to deploy code on a remote host and can only use push
+(because your workstation is behind a firewall and you cannot pull
+from it) you do that in two steps using two repositories: you push
+from the workstation to a bare repo on the remote host, ssh to the
+remote host and pull from the bare repo to a non-bare deployment repo.
+
Tags
''''
``git fetch --tags origin``. To fetch some specific tags fetch them
explicitly::
- $ git fetch origin tag NAME1 tag NAME2...
+ $ git fetch origin tag TAG1 tag TAG2...
For example::
Git doesn't automatically pushes tags. That allows you to have private
tags (lightweight tags are also private for a repo, they cannot be
-pushed). To push tag(s) list them explicitly::
+pushed). To push tags list them explicitly::
$ git push origin tag 1.4.2
$ git push origin v1 v2 tag 2.1.7
+Don't move tags with ``git tag -f`` after they have been published.
+
Commit editing and caveats
==========================
https://kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.html
-Advanced topics
-===============
-
-Staging area
-------------
-
-Staging area aka index is a distinguishing feature of git. See
-`WhatIsTheIndex
-<https://git.wiki.kernel.org/index.php/WhatIsTheIndex>`_ and
-`IndexCommandQuickref
-<https://git.wiki.kernel.org/index.php/IndexCommandQuickref>`_ in Git
-Wiki.
-
-
Merge or rebase?
================
https://git-scm.com/book/en/Git-Tools-Rerere
+Advanced topics
+===============
+
+Staging area
+------------
+
+Staging area aka index is a distinguishing feature of git. See
+`WhatIsTheIndex
+<https://git.wiki.kernel.org/index.php/WhatIsTheIndex>`_ and
+`IndexCommandQuickref
+<https://git.wiki.kernel.org/index.php/IndexCommandQuickref>`_ in Git
+Wiki.
+
+
Advanced configuration
======================
Tips and tricks
===============
+TODO: sticky options; example: git grep -O.
+
TODO: bash/zsh completion, bash/zsh prompt.