How can I check whether a git repository has any commits in it?

I am writing a custom git command that should only run in a completely new repository with no commits (see this question). How can I perform a simple check within my script to see if an existing repo has zero commits?

Essentially, what goes in the blank below?

  • Difference between “git checkout <filename>” and “git checkout -​- <filename>”
  • Howto extract a git subdirectory and make a submodule out of it?
  • NPM start throwing errors
  • GitHub: Permission denied (publickey). fatal: The remote end hung up unexpectedly
  • Partial sharing of git repositories
  • Why would a line's SHA in a git blame view have a leading caret (^)?
  • if ___________ ; then
        echo "Git repo already has commits. Aborting.
        echo "Git repo has no commits. Doing whatever my script does."

  • Circleci: How to deploy depending on git tag
  • What is the difference between 'git pull' and 'git fetch'?
  • from command line ok but the hook (git)
  • Subrepo workflow issue in switch from Hg to Git
  • Is there a simple way to “git describe” a remote repository?
  • How to check if Git is installed from .bashrc
  • 2 Solutions collect form web for “How can I check whether a git repository has any commits in it?”


    • A commit is checked out: test git rev-parse HEAD &> /dev/null
    • A ref pointing to a commit exists: test git rev-list -n 1 --all &> /dev/null
    • Objects exist in the repo: test output of git fsck, git count-objects, or the examine the contents of .git/objects

    And now for the discussion!

    If you want to know whether a commit is checked out, you can use git rev-parse HEAD. There will be output, so you probably want to redirect to /dev/null and just use the exit code. For all practical purposes, this will be good enough – doing normal things, it’s pretty much impossible to end up without HEAD pointing at anything. But it is possible, for example by deleting files in the .git directory. Depending on your script, this might be important – if you’re about to blow away the .git directory, you want to be paranoid indeed.

    If you want to see whether there are any refs at all with commits on them, you can use git rev-list -n 1 --all. Again, there will be output (the SHA1 of the first commit encountered), so redirect to /dev/null and check the exit code.

    Finally, if you want to check if there are any commits – even if they aren’t on any refs (you have to try really hard to get into this state) I’d probably just check for the presence of objects with git fsck or git count-objects – or failing that, list .git/objects and check for anything besides info and pack (commands tend to fail if there is no file .git/HEAD). And yes, you could actually have a repo with blobs and trees but no commits, but you’d have to try even harder to get there. These are the absolute safest methods, if your script is scary.

    You want to use git log

    If you are using cygwin or are on a linux machine gitk is a useful program to have as well.

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