How to create a new (and empty!) "root" branch?
git
Solution
Use the `--orphan` when creating the branch:
git checkout --orphan YourBranchName
This will create a new branch with zero commits on it, however all of your files will be staged. At that point you could just remove them. ("remove them": A `git reset --hard` will empty the index, leaving you with an empty working tree)
Take a look at the man page for checkout for more information on --orphan.
Problem
I would like to define a new "root" branch in this git repository. By "root" branch I mean a branch that is entirely independent of all the other branches in the repository1. Unfortunately, even the commit (let's call it `A`) at the very base of the repo's commit tree contains a lot of files (this was a repository that was initialized on an already fairly mature project). This means that even if I gave `A` as the new branch's `<start-point>`, this new branch would not start from a "clean slate", but rather it would contain all the files that were committed in `A`. Is there some way I can create a completely bare branch in this repository, with `<start-point>` as close to `A` as possible? 1BTW, this is not equivalent to creating a new repo. Separate repos would be less convenient for a lot of reasons. EDIT: OK, this is what I did, based on vcsjones' answer: ``` # save rev of the current earliest commit OLDBASE=$(git rev-list --max-parents=0 HEAD) # create a new orphan branch and switch to it git checkout --orphan newbranch # make sure it's empty git rm -rf . # create a new empty commit in the new branch, and # save its rev in NEWBASE git commit --allow-empty -m 'base commit (empty)' NEWBASE=$(git rev-list HEAD) # specify $NEWBASE as the new parent for $OLDBASE, and # run filter-branch on the original branch echo "$OLDBASE $NEWBASE" > .git/info/grafts git checkout master git filter-branch # NOTE: this assumes that the original repo had only one # branch; if not, a git-filter-branch -f <branch> command # need to be run for each additional branch. rm .git/info/grafts ``` Although this procedure is a bit involved, the end result is an empty base commit that can serve as the `<start-point>` for any new "clean-slate branch"; all I'd need to do then is ``` git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD) ``` In the future I will always create new repositories like this: ``` git init git commit --allow-empty -m 'base commit (empty)' ``` ...so that the first commit is empty, and always available for starting a new independent branch. (This would be, I know, a very rarely needed facility, but it is quite effortless to make it readily available.)
Related problems
- In git, is there a simple way of introducing an unrelated branch to a repository?
- Creating a new empty branch for a new project
- Change first commit of project with Git?
- 'git checkout' docs claim working tree will change; why are edits not discarded?
- Insert a commit before the root commit in Git?
- Is git's semi-secret empty tree object reliable, and why is there not a symbolic name for it?