gitbranchcommitancestor

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:

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.)


Solution

  • Sure,

    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