threads / discuss / 40137

Why does 'git branch -d' act differntly after clone?

Subject: Why does 'git branch -d' act differntly after clone?

## tl;dr

2 messages between Aug 20, 2015 and Aug 20, 2015.

replies: 1people: 2as markdown or json

Konstantin Hollerith· Aug 20, 2015, 12:10 UTC · lore
Hi,

I created a simple repository. If i create a new branch from master and commit some changes and then delete it with

    git branch -d neuerTestBranch
I'll get a error:
    error: The branch 'neuerTestBranch' is not fully merged.

I like that error, it reminds me, that i forgot to merge. However, if i don't delete this branch and clone the Repository somewhere else, i don't get the error anymore. When i delete the branch now, i get this message:

    warning: deleting branch 'neuerTestBranch' that has been merged to
    'refs/remotes/origin/neuerTestBranch', but not yet merged to HEAD.
And the Branch is deleted right away.

Why does git branch -d acts differently after a clone? Is this behavior maybe a Bug? Is it possible to force a behavior like the first in cloned repositories, too?

I use 'git version 2.5.0.windows.1'.

Cheers, Konstantin

Junio C Hamano· Aug 20, 2015, 15:49 UTC · re: Konstantin Hollerith · lore

Re: Why does 'git branch -d' act differntly after clone?

Konstantin Hollerith <khollerith@gmail.com> writes:
> Why does git branch -d acts differently after a clone?

In the former case, that branch is the only thing that knows about the commits near the tip of it. Immediately after you clone that repository, you have a copy of that branch as a remote-tracking branch for origin/neuerTestBranch. You didn't say how you got a local copy of it in there, but I'd imagine that in the clone you did something like:

    $ git checkout neuerTestBranch
which is a short-hand for
    $ git checkout -b neuerTestBranch origin/neuerTestBranch

and then went back to a branch other than that branch when you asked the branch to be removed, e.g.

    $ git checkout master
    $ git branch -d neuerTestBranch
without building any further history on neuerTestBranch.

Now, your local neuerTestBranch is a mere unmodified copy of the remote-tracking branch origin/neuerTestBranch; the commits on the former will not become unreachable if you remove neuerTestBranch, because they are all reachable via origin/neuerTestBranch. And that is why the deletion of it has less severe potential of information lossage, compared to the original case where you attempt to remove the only copy.

← back to recent threads