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.
+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.
$ 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.
+Don't move tags with ``git tag -f`` or remove tags with ``git tag -d``
+after they have been published.
Commit editing and caveats
====
Whatever you do, don't panic. Almost anything in git can be undone.
+
+git checkout: restore file's content
+------------------------------------
+
``git checkout``, for example, can be used to restore the content of
file(s) to that one of a commit. Like this::
git checkout HEAD~ README
The commands restores the contents of README file to the last but one
-commit in the current branch. By default a commit ID is simple HEAD;
+commit in the current branch. By default a commit ID is simply HEAD;
i.e. ``git checkout README`` restores README to the latest commit.
(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``).
+git reset: remove (non-pushed) commits
+--------------------------------------
+
``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
+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.
difference very clearly. Bare repositories don't have indices or
working trees so in a bare repo only soft reset is possible.
+Unstaging
+'''''''''
+
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.
+that is, to remove from index changes added with ``git add`` for
+committing. See `The Book
+<https://git-scm.com/book/en/Git-Basics-Undoing-Things>`_ for details
+about unstaging and other undo tricks.
-TODO: describe undo strategies: git reflog, git revert.
-"Commit early, commit often".
+git reflog: reference log
+-------------------------
+
+git revert: revert a commit
+---------------------------
How to undo a merge
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.html
+One thing that cannot be undone
+-------------------------------
+
+"Commit early, commit often".
+
Merge or rebase?
================