freely.
-Remote repository and remote branches
-=====================================
+Remote repositories and remote branches
+=======================================
Another example of slightly misleading terminology. Remote
repositories are really remote, you access them via network (well, a
You never do your own development on remote branches. You create a
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.
+on that local branch. On push git pushes commits to the remote repo
+and updates remote branches, on pull git fetches commits from the
+remote repo, updates remote branches and fast-forwards, merges or
+rebases local branches.
When you do an initial clone like this::
(Do not use ``git checkout`` to view a content of a file in a commit,
use ``git cat-file -p``; e.g. ``git cat-file -p HEAD~:path/to/README``).
-TODO: describe undo strategies: git reset, git reflog, git revert.
+``git reset`` moves the head of the current branch. The head can be
+moved to point to any commit but it's often used to remove a commit or
+a few (preferably, non-pushed ones) from the top of the branch - that
+is, to move the branch backward in order to undo a few non-pushed
+commits.
+
+``git reset`` has three modes of operation - soft, hard and mixed.
+Default is mixed. ProGit `explains
+<https://git-scm.com/book/en/Git-Tools-Reset-Demystified>`_ the
+difference very clearly. Bare repositories don't have indices or
+working trees so in a bare repo only soft reset is possible.
+
+Mixed mode reset with a path or paths can be used to unstage changes -
+that is, to remove changes added with ``git add`` for committing. See
+`The Book <https://git-scm.com/book/en/v2/Git-Basics-Undoing-Things>`_
+for details about unstaging and other undo tricks.
+
+TODO: describe undo strategies: git reflog, git revert.
"Commit early, commit often".
How to undo a merge
--rebase`` or even configure automatic setup of rebase for every new
branch::
- $ git config branch.autosetuprebase true
+ $ git config branch.autosetuprebase always
and configure rebase for existing branches::