Skip to content

Instantly share code, notes, and snippets.

@seanbuscay
Created June 27, 2013 15:26
Show Gist options
  • Save seanbuscay/5877413 to your computer and use it in GitHub Desktop.
Save seanbuscay/5877413 to your computer and use it in GitHub Desktop.
Create an orphan branch in a repo.
cd repository
git checkout --orphan orphan_name
git rm -rf .
rm '.gitignore'
echo "#Title of Readme" > README.md
git add README.md
git commit -a -m "Initial Commit"
git push origin orphan_name
@shadiakiki1986
Copy link

As a newcomer to git orphan branches, I was confused why there was a need for git rm -rf . if it's "orphaned". I was expecting it to not have any committed files at all. Indeed there are no committed files, but the files from the branch from which this orphan branch is checkout'ed (is this even a word?) are automatically staged. To illustrate:

cd repository

ls
# file1   file2   file3

git status
# No changes

git checkout --orphan orphan_name

git status
On branch orphan_name

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   file1
        new file:   file2
        new file:   file3

@robtimus
Copy link

robtimus commented May 3, 2020

git reset --hard also removes everything to its initial state

@creepteks
Copy link

git reset --hard also removes everything to its initial state

according to this answer on StackOverflow, git reset --hard cannot be helpful in this specific case.

@robtimus
Copy link

Interesting, it's worked for me. For example:

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (master)
$ ls | wc -l
5

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (master)
$ git checkout --orphan orphan-branch
Switched to a new branch 'orphan-branch'

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (orphan-branch)
$ ls | wc -l
5

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (orphan-branch)
$ git reset --hard

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (orphan-branch)
$ ls | wc -l
1

Rob@Robtimus MINGW64 /d/Code/Java/github/connect-sdk-java/connect-sdk-java-spring-boot-starter (orphan-branch)
$ git status
On branch orphan-branch

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .classpath
        .project
        .settings/
        target/

nothing added to commit but untracked files present (use "git add" to track)

After the checkout, I omitted the git status because it showed every file being marked as a new file. Maybe that's why it didn't work on SO, because files were not part of the index.

@KartikSoneji
Copy link

Note that using git switch --orphan <branch name> automatically removes ALL files from the working tree.

@kurahaupo
Copy link

@anfxanfx
Copy link

Commenting on KartikSoneji (Jul 15) above: git: 'switch' is not a git command. See 'git --help'.

@KartikSoneji
Copy link

@anfxanfx
git switch was introduced in git 2.23, you might need to update your git client.
https://git-scm.com/docs/git-switch

@kurahaupo
Copy link

For those who don't have access to a bleeding-edge version of git, I have a simple work-around: make an empty commit when the repo is new, tag it, and then use that as the base for any orphan branches.

git init
git commit --allow-empty
git tag empty

then git checkout --orphan new_branch empty.

As a bonus, you can now use git rebase -i empty, to amend or remove what would otherwise have been the "initial" commit.

@KartikSoneji the documentation still (as of 2.29.0) says:

THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.

@mlandes
Copy link

mlandes commented Feb 9, 2022

On git 2.23, all I needed was:

git switch --orphan <branch_name>
git commit --allow-empty -m "<commit_msg>"
git push origin <branch_name>

@SeanHorner
Copy link

shadiakiki1986

you're looking for "checkedout", not "checkout'ed" 👍

@kurahaupo
Copy link

@SeanHorner see gist:7df6c8a5…

(I note that checkout is a git verb, so in this context it's not so unreasonable to conjugate it as checkouts and checkouted - just as long as nobody says those out loud.)

@SeanHorner
Copy link

@SeanHorner see gist:7df6c8a5…

(I note that checkout is a git verb, so in this context it's not so unreasonable to conjugate it as checkouts and checkouted - just as long as nobody says those out loud.)

Ah, didn't think about it in that context, was using my linguist brain, not coding brain xD. Very interesting (and thorough) discussion in the linked gist 👍

@MrSrv7
Copy link

MrSrv7 commented Sep 6, 2022

Note that using git switch --orphan <branch name> automatically removes ALL files from the working tree.

Note that whatever is ignored by .gitignore won't be removed.

@mralusw
Copy link

mralusw commented Mar 30, 2024

Note that using git switch --orphan <branch name> automatically removes ALL files from the working tree.

Note that whatever is ignored by .gitignore won't be removed.

Note that git switch --orphan <branch name> automatically removes ALL tracked files from the working tree (as it should, since we don't want files from other branches — it's an orphan branch). It will not remove

  • untracked files
  • modified (not yet committed) tracked files (because it refuses to proceed in this scenario)

This is independent of .gitignore. However, there are many other ways to exclude files (e.g. .git/info/exclude, git update-index --skip-worktree etc). If you use any of those, possibly together and along .gitignore, you probably have bigger things to worry about.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment