Must every git commit be an ancestor of a branch?

Given this git tree:

A <--- B <--- C (HEAD, master)

is it possible to put the tree into this state:

  • With Git, how can I show the tree of commits that all share a common ancestor?
  • Can the most recent common ancestor in git be ambiguous?
  • A <--- B (HEAD, master) <--- C

    (There are no branches or tags other than master.) In other words, can a commit (C) exist without either being a commit pointed to by a branch (or tag) or the ancestor of a commit pointed to by a branch (or tag)?

    (This question is purely theoretical to help me understand better how git branches works.)

  • How can I keep track of where commits came from once they've been merged?
  • How can I recover a commit to an unnamed branch in Git?
  • How to branch and merge properly with Git?
  • Consequences of using graft in Mercurial
  • How do I create a new branch using TortoiseSVN?
  • Git: Revert to previous commit status
  • 2 Solutions collect form web for “Must every git commit be an ancestor of a branch?”


    git checkout -b tmp
    touch whatever.txt
    git add -A
    git commit -m "committed!"
    git checkout master
    git branch -D tmp

    The commit whose predecessor is the current HEAD of master is now still available, but no name is pointing to it. You can still get to it e.g. with the reflog commands.

    Another possibility, given that C already exists:

    git checkout -b tmp
    git checkout master
    git reset --hard HEAD-1
    git branch -D tmp

    ps, cannot find the tilde key on this kb…

    Commit C can exist temporarily (as a dangling commit); once a GC occurs it will be reclaimed.


    git fsck --unreachable

    to see dangling commits and blobs. Note that because git has a notion of reflog what you’ve described won’t create a dangling commit right away, C will stay in the reflog for a while. git maintains the reflog just in case you’ve made a mistake and need to recover something.

    Git Baby is a git and github fan, let's start git clone.