]> git.phdru.name Git - git-wiki.git/blobdiff - pep-git.txt
Change wording
[git-wiki.git] / pep-git.txt
index e51ae53d5e24a23d68ef325421a49beab0ca007d..9f7eeea29faf08bcbecd3a224efe9b220606409e 100644 (file)
@@ -14,7 +14,7 @@ Abstract
 
 This Informational PEP collects information about git. There is, of
 course, a lot of documentation for git, so the PEP concentrates on
 
 This Informational PEP collects information about git. There is, of
 course, a lot of documentation for git, so the PEP concentrates on
-more complex issues, topics and scenarios.
+more complex issues, scenarios and topics.
 
 The plan is to extend the PEP in the future collecting information
 about equivalence of Mercurial and git scenarios to help migrating
 
 The plan is to extend the PEP in the future collecting information
 about equivalence of Mercurial and git scenarios to help migrating
@@ -23,6 +23,7 @@ Python development from Mercurial to git.
 The author of the PEP doesn't currently plan to write a Process PEP on
 migration from Mercurial to git.
 
 The author of the PEP doesn't currently plan to write a Process PEP on
 migration from Mercurial to git.
 
+
 Documentation
 =============
 
 Documentation
 =============
 
@@ -64,6 +65,7 @@ Offline documentation
 Git has builtin help: run ``git help TOPIC``. For example, run
 ``git help git`` or ``git help help``.
 
 Git has builtin help: run ``git help TOPIC``. For example, run
 ``git help git`` or ``git help help``.
 
+
 Quick start
 ===========
 
 Quick start
 ===========
 
@@ -84,11 +86,188 @@ Initial configuration
 ---------------------
 
 This simple code is often appears in documentation, but it is
 ---------------------
 
 This simple code is often appears in documentation, but it is
-important so let repeat it here::
+important so let repeat it here. Git marks every commit with author
+and commiter names/emails, 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
 
+
+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 ``v2``. For most examples the
+currently checked out branch is ``v2``. That is, it's assumed you did
+something like that::
+
+    $ git clone -b v1 http://git.python.org/python.git
+    $ cd python
+    $ git fetch origin v2:v2
+    $ git checkout -b v2
+
+
+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 differentiate 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 repository and remote branches
+=====================================
+
+Another example of slightly misleading terminology. Remote
+repositories are really remote, you access them via network (well, a
+remote repository can be on your local disk, but it's still remote
+because it's not the current repo).
+
+Remote branches, on the other hand, are branches (pointers to commits)
+in your local repository. They are there 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 branches
+live under ``remotes/REMOTE`` namespaces, e.g. ``remotes/origin/v2``.
+
+To see the status of remote branches run::
+
+    $ git branch -rv
+
+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
+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.
+
+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.
+
+
+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.
+
+It is possible to recover from forced push but it's PITA for the
+entire team. Please avoid it.
+
+To see what commits have not been published yet compare the head of the
+branch with its upstream remote branch::
+
+    $ git log origin/v2..
+    $ git log origin/v1..v1
+
+For every branch that has an upstream remote branch git maintains an
+alias @{upstream} (short version @{u}), so the commands above can be
+given as::
+
+    $ git log @{u}..
+    $ git log v1@{u}..v1
+
+To see the status of all branches::
+
+    $ git branch -avv
+
+To compare the status of local branches with a remote repo::
+
+    $ git remote show origin
+
+Read `how to recover from upstream rebase
+<https://git-scm.com/docs/git-rebase#_recovering_from_upstream_rebase>`_.
+It is in ``git help rebase``.
+
+On the other hand don't be too afraid about commit editing. You can
+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
+repository.
+
+
+Undo
+====
+
+TODO: describe undo strategies: git reset, git revert, git checkout,
+git reflog. "Commit early, commit often".
+
+How to undo a merge
+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.
+
+
+Advanced configuration
+======================
+
+Line endings
+------------
+
+Git has builtin mechanisms to handle line endings.
+
+TODO: describe crlf configuration and .gitattributes.
+
+
+Null-merges
+===========
+
+Git has a builtin strategy for what Python core developers call
+"null-merge"::
+
+    $ git merge -s ours v1 # null-merge v1 into v2
+
+
+Database maintenance
+====================
+
+TODO: dangling objects, git gc, git repack.
+
+
+Tips and tricks
+===============
+
+TODO: bash/zsh completion, bash/zsh prompt.
+
+
+From Mercurial to git
+=====================
+
+Mercurial for Git users https://mercurial.selenic.com/wiki/GitConcepts
+
+https://github.com/felipec/git-remote-hg
+
+https://hg-git.github.io/
+
+
 References
 ==========
 
 References
 ==========