Abstract
This page (it was PEP 103) collects information about git. There is, of course, a lot of documentation for git, so the PEP concentrates on more complex (and more related to Python development) issues, scenarios and examples.
Documentation
Git is accompanied with a lot of documentation, both online and offline.
Documentation for starters
Git User's manual. Everyday GIT With 20 Commands Or So. Git workflows.
Advanced documentation
Git Magic, with a number of translations.
Pro Git. The Book about git. Buy it at Amazon or download in PDF, mobi, or ePub form. It has translations to many different languages. Download Russian translation from GArik.
Git Buch (German).
Builtin help
Run git help $TOPIC. For example, run git help git or git help help. Run git help -a to list help topics for all available commands; git help -g to list help guides, i.e. help topics that aren't commands.
Quick start
Download and installation
Unix users: download and install using your package manager.
Microsoft Windows: download git-for-windows.
MacOS X: use git installed with XCode or download from MacPorts or git-osx-installer or install git with Homebrew: brew install git.
git-cola (repository) is a Git GUI written in Python and GPL licensed. Linux, Windows, MacOS X.
GitAhead is a completely free and open source graphical Git client for Linux, Windows and macOS.
TortoiseGit is a Windows Shell Interface to Git based on TortoiseSVN; open source.
Initial configuration
This simple code is often appears in documentation, but it is important so let repeat it here. Git stores author and committer names/emails in every commit, so configure your real name and preferred email:
$ git config --global user.name "User Name" $ git config --global user.email user.name@example.org
Examples in this PEP
Examples of git commands in this PEP use the following approach. It is supposed that you, the user, works with a local repository named python that has an upstream remote repo named origin. Your local repo has two branches v1 and master. For most examples the currently checked out branch is master. That is, it's assumed you have done something like that:
$ git clone https://git.python.org/python.git $ cd python $ git branch v1 origin/v1
The first command clones remote repository into local directory python`, creates a new local branch master, sets remotes/origin/master as its upstream remote-tracking branch and checks it out into the working directory.
The last command creates a new local branch v1 and sets remotes/origin/v1 as its upstream remote-tracking branch.
The same result can be achieved with commands:
$ git clone -b v1 https://git.python.org/python.git $ cd python $ git checkout --track origin/master
The last command creates a new local branch master, sets remotes/origin/master as its upstream remote-tracking branch and checks it out into the working directory.
Branches and branches
Git terminology can be a bit misleading. Take, for example, the term "branch". In git it has two meanings. A branch is a directed line of commits (possibly with merges). And a branch is a label or a pointer assigned to a line of commits. It is important to distinguish when you talk about commits and when about their labels. Lines of commits are by itself unnamed and are usually only lengthening and merging. Labels, on the other hand, can be created, moved, renamed and deleted freely.
Remote repositories and remote branches
Remote-tracking branches are branches (pointers to commits) in your local repository. They are there for git (and for you) to remember what branches and commits have been pulled from and pushed to what remote repos (you can pull from and push to many remotes). Remote-tracking branches live under remotes/$REMOTE namespaces, e.g. remotes/origin/master.
To see the status of remote-tracking branches run:
$ git branch -rv
To see local and remote-tracking branches (and tags) pointing to commits:
$ git log --decorate
You never do your own development on remote-tracking branches. You create a local branch that has a remote branch as upstream and do development on that local branch. On push git pushes commits to the remote repo and updates remote-tracking branches, on pull git fetches commits from the remote repo, updates remote-tracking branches and fast-forwards, merges or rebases local branches.
When you do an initial clone like this:
$ git clone -b v1 https://git.python.org/python.git
git clones remote repository https://git.python.org/python.git to directory python, creates a remote named origin, creates remote-tracking branches, creates a local branch v1, configure it to track upstream remotes/origin/v1 branch and checks out v1 into the working directory.
Some commands, like git status --branch and git branch --verbose, report the difference between local and remote branches. Please remember they only do comparison with remote-tracking branches in your local repository, and the state of those remote-tracking branches can be outdated. To update remote-tracking branches you either fetch and merge (or rebase) commits from the remote repository or update remote-tracking branches without updating local branches.
Updating local and remote-tracking branches
To update remote-tracking branches without updating local branches run git remote update [$REMOTE...]. For example:
$ git remote update $ git remote update origin
