Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jgit-dev] Create orphan branch

Hello Mike,

Your struggle sounds similar to the one I had that lead to this SO question. I don’t know if any of the JGit command classes have been updated to handle your situation, but lower-level API will work.

There are four low-level steps to create and checkout a detached orphan branch with JGit from the files in the working dir:
  1. Create a tree object.
    • I used the index (JGit DirCache) for that, but I think there are other methods.
  2. Create a parentless (orphan) commit from the tree object.
  3. Update a Ref to point to the commit.
    • This creates an orphan branch.
  4. Update the link for the HEAD symbolic ref.
    • If you want a detached checkout, this is when you specify that.

I’m including some code below for that. This is untested and extracted from a production application using JGit 2.0, but it at least compiles without warnings with JGit 5.12. It should be an ok starting point.




import org.eclipse.jgit.lib.CommitBuilder;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.Repository;

public class OrphanBranchExample {
private final Repository repo;
private final PersonIdent personIdent;

private OrphanBranchExample(Repository repo, PersonIdent personIdent) {
this.repo = repo;
this.personIdent = personIdent;

public void createAndCheckoutOrphanBranch(
String refName, boolean detach, boolean force
) throws IOException {
ObjectInserter inserter = repo.newObjectInserter();
ObjectId commitId = null;

try {
ObjectId treeId = createTree(inserter);
if (treeId != null) {
commitId = insertCommit(inserter, treeId);
} finally {

if (commitId != null) {
String fullRef = Constants.R_HEADS + refName;
setRef(fullRef, commitId, force);
updateHead(fullRef, detach, force);

/** Returns null to basically abort. */
private ObjectId createTree(ObjectInserter inserter) {
// TODO Auto-generated method stub
return null;

private ObjectId insertCommit(
ObjectInserter inserter, ObjectId treeId
) throws IOException {
CommitBuilder commitBuilder = new CommitBuilder();

return inserter.insert(commitBuilder);

private void setRef(
String fullRef, ObjectId commitId, boolean force
) throws IOException {
RefUpdate refUpdate = repo.getRefDatabase().newUpdate(fullRef, false);

private void updateHead(
String newHead, boolean detach, boolean force
) throws IOException {
RefUpdate refUpdate = repo.getRefDatabase()
.newUpdate(Constants.HEAD, detach);


On Jun 27, 2021, at 03:35:05, Mike Limansky <mike.limansky@xxxxxxxxx> wrote:


  I've tried to use CheckoutCommand to create an orphan branch, and found that it still has a parent. As I see from the Javadocs and sources, the startCommit has to be defined (or current HEAD is used).  This is really different from `git checkout --orphan` which creates branches detached from current history. I tried to set empty start point (.setStartPoint(walk.parseCommit(ObjectId.zeroId()))) but It fails, because zero commit is not resolved.

Could anybody please clarify if it is possible to achieve the same behavior with git checkout --detach using JGit API?

jgit-dev mailing list
To unsubscribe from this list, visit

Back to the top