This wiki is in the process of being archived due to lack of usage and the resources necessary to serve it — predominately to bots, crawlers, and LLM companies. Edits are discouraged.
Pages are preserved as they were at the time of archival. For current information, please visit python.org.
If a change to this archive is absolutely needed, requests can be made via the infrastructure@python.org mailing list.

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 Tutorial: part 1, part 2.

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 Wiki.

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