]> git.phdru.name Git - git-wiki.git/blobdiff - pep-git.txt
Add TortoiseGit
[git-wiki.git] / pep-git.txt
index a4b957b8378456b509817aab80b7bcdfd14ea676..2b55d6341cc55f7a9ceb87e9010ef0d680d97c18 100644 (file)
@@ -75,20 +75,30 @@ Download and installation
 Unix users: download and install using your package manager.
 
 Microsoft Windows: download `git-for-windows
 Unix users: download and install using your package manager.
 
 Microsoft Windows: download `git-for-windows
-<https://git-for-windows.github.io/>`_.
+<https://github.com/git-for-windows/git/releases>`_ or `msysGit
+<https://github.com/msysgit/msysgit/releases>`_.
 
 MacOS X: use git installed with `XCode
 
 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
 `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``.
+
+`git-cola <https://git-cola.github.io/index.html>`_ is a sleek and
+powerful Git GUI written in Python and GPL licensed. Linux, Windows,
+MacOS X.
+
+`TortoiseGit <https://tortoisegit.org/>`_ 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
 
 Initial configuration
 ---------------------
 
 This simple code is often appears in documentation, but it is
-important so let repeat it here. Git marks every commit with author
-and commiter names/emails, so configure your real name and preferred
-email::
+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
 
     $ git config --global user.name "User Name"
     $ git config --global user.email user.name@example.org
@@ -101,13 +111,25 @@ 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 ``v2``. For most examples the
 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 ``v2``. For most examples the
-currently checked out branch is ``v2``. That is, it's assumed you did
-something like that::
+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 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
 
 
 Branches and branches
@@ -146,18 +168,19 @@ To see local and remote branches (and tags) pointing to commits::
     $ git log --decorate
 
 You never do your own development on remote branches. You create a
     $ git log --decorate
 
 You never do your own development on remote branches. You create a
-local branch that has a remote branch as an upstream and do
-development on that local branch. On push git updates remote branches,
-and on pull git updates remote branches and fast-forwards, merges or
-rebases local branches.
+local branch that has a remote branch as upstream and do development
+on that local branch. On push git updates remote branches, and on pull
+git updates remote branches and fast-forwards, merges or rebases local
+branches.
 
 When you do an initial clone like this::
 
     $ git clone -b v1 http://git.python.org/python.git
 
 git clones remote repository ``http://git.python.org/python.git`` to
 
 When you do an initial clone like this::
 
     $ 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
 ----------------------------------
 
 Updating local and remote branches
 ----------------------------------
@@ -185,7 +208,7 @@ branch BRANCH and its upstream remote branch. But it refuses to update
 branches in case of non-fast-forward. And it refuses to update the
 current branch.
 
 branches in case of non-fast-forward. And it refuses to update the
 current branch.
 
-The first command is used internall by ``git pull``.
+The first command is used internally by ``git pull``.
 
 ::
 
 
 ::
 
@@ -207,6 +230,20 @@ that non-current branch and then merge::
                                   # rebase instead of merge
     $ git merge v1
 
                                   # rebase instead of merge
     $ git merge v1
 
+If you have not yet pushed commits on ``v1``, though, the scenario has
+to become a bit more complex. Git refuses to update
+non-fast-forwardable branch, and you don't want to do force-pull
+because that would remove your non-pushed commits and you would need
+to recover. So you want to rebase ``v1`` but you cannot rebase
+non-current branch. Hence, checkout ``v1`` and rebase it before
+merging::
+
+    $ git checkout v1
+    $ git pull --rebase origin v1
+    $ git checkout v2
+    $ git pull --rebase origin v2
+    $ git merge v1
+
 It is possible to configure git to make it fetch/pull a few branches
 or all branches at once, so you can simply run
 
 It is possible to configure git to make it fetch/pull a few branches
 or all branches at once, so you can simply run
 
@@ -264,6 +301,12 @@ non-bare repository: git refuses to update remote working directory.
 You really should push only to bare repositories. For non-bare
 repositories git prefers pull-based workflow.
 
 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
 ''''
 
 Tags
 ''''
 
@@ -272,7 +315,7 @@ during fetch/pull. To fetch all tags (and commits they point to) run
 ``git fetch --tags origin``. To fetch some specific tags fetch them
 explicitly::
 
 ``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::
 
 
 For example::
 
@@ -280,17 +323,19 @@ 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
 
 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
 
 
     $ 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
 ==========================
 
 A warning not to edit published (pushed) commits also appears in
 
 Commit editing and caveats
 ==========================
 
 A warning not to edit published (pushed) commits also appears in
-documentation but it's also repeated here as it's very important.
+documentation but it's repeated here anyway as it's very important.
 
 It is possible to recover from forced push but it's PITA for the
 entire team. Please avoid it.
 
 It is possible to recover from forced push but it's PITA for the
 entire team. Please avoid it.
@@ -325,7 +370,7 @@ safely edit, remove, reorder, combine and split commits that hasn't
 been pushed yet. You can even push commits to your own (backup) repo,
 edit them later and force-push edited commits to replace what has
 already been pushed. Not a problem until commits are in a public
 been pushed yet. You can even push commits to your own (backup) repo,
 edit them later and force-push edited commits to replace what has
 already been pushed. Not a problem until commits are in a public
-repository.
+or shared repository.
 
 
 Undo
 
 
 Undo
@@ -338,22 +383,58 @@ How to undo a merge
 https://kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.html
 
 
 https://kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.html
 
 
-Advanced topics
-===============
+Merge or rebase?
+================
 
 
-Staging area
-------------
+Internet is full of heated discussions on the topic: "merge or
+rebase?" Most of them are meaningless. When a DVCS is being used in a
+big team with a big and complex project with many branches there is
+simply no way to avoid merges. So the question diminished to "whether
+to use rebase, and if yes - when to use rebase?" Considering that it
+is very much recommended not to rebase published commits the question
+diminished even further: "whether to use rebase on non-pushed
+commits?"
 
 
-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.
+That small question is for the team to decide. The author of the PEP
+recommends to use rebase when pulling, i.e. always do ``git pull
+--rebase`` or even configure automatic setup of rebase for every new
+branch::
 
 
+    $ git config branch.autosetuprebase true
 
 
-Merge or rebase?
-================
+and configure rebase for existing branches::
+
+    $ git config branch.NAME.rebase true
+
+After that ``git pull origin v2`` will be equivalent to ``git pull
+--rebase origin v2``.
+
+In case when merge is preferred it is recommended to create new
+commits in a separate feature or topic branch while using rebase to
+update the mainline branch. When the topic branch is ready merge it
+into mainline. To avoid a tedious task of resolving conflicts you can
+merge the topic branch to the mainline from time to time and switch
+back to the topic branch to continue working on it. The entire
+workflow would be something like::
+
+    $ git checkout -b issue-42 # create and switch to a new branch
+        ...edit/test/commit...
+    $ git checkout v2
+    $ git pull --rebase origin v2 # update v2 from the upstream
+    $ git merge issue-42
+    $ git branch -d issue-42 # delete the topic branch
+    $ git push origin v2
+
+When the topic branch is deleted only the label is removed, commits
+are stayed in the database, they are now merged into v2::
+
+    --o--o--o--o--o--o-M-<v2 - it is the mainline branch
+            \         /
+             --*--*--*       - it is the topic branch, now unnamed
+
+The topic branch is deleted to avoid cluttering branch namespace with
+small topic branches. Information on what issue was fixed or what
+feature was implemented should be in the commit messages.
 
 
 Null-merges
 
 
 Null-merges
@@ -371,6 +452,20 @@ ReReRe
 https://git-scm.com/book/en/Git-Tools-Rerere
 
 
 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
 ======================
 
 Advanced configuration
 ======================
 
@@ -391,9 +486,17 @@ TODO: dangling objects, git gc, git repack.
 Tips and tricks
 ===============
 
 Tips and tricks
 ===============
 
+TODO: sticky options; example: git grep -O.
+
 TODO: bash/zsh completion, bash/zsh prompt.
 
 
 TODO: bash/zsh completion, bash/zsh prompt.
 
 
+git on server
+=============
+
+TODO: anonymous access; git over ssh; gitolite; gitweb; cgit; gitlab.
+
+
 From Mercurial to git
 =====================
 
 From Mercurial to git
 =====================