threads / discuss / 1791

deleting a branch

Subject: deleting a branch

## tl;dr

6 messages between Sep 13, 2005 and Sep 14, 2005.

replies: 5people: 3as markdown or json

Chuck Lever· Sep 13, 2005, 15:39 UTC · lore
a couple of newbie questions.
1.  how do i delete a branch?
2.  is there a conventional place where branch description files reside?

begin:vcard fn:Chuck Lever n:Lever;Charles org:Network Appliance, Incorporated;Linux NFS Client Development adr:535 West William Street, Suite 3100;;Center for Information Technology Integration;Ann Arbor;MI;48103-4943;USA email;internet:cel@citi.umich.edu title:Member of Technical Staff tel;work:+1 734 763 4415 tel;fax:+1 734 763 4434 tel;home:+1 734 668 1089 x-mozilla-html:FALSE url:http://www.monkey.org/~cel/ version:2.1 end:vcard

Junio C Hamano· Sep 13, 2005, 16:05 UTC · re: Chuck Lever · lore

Re: deleting a branch

Chuck Lever <cel@citi.umich.edu> writes:
> a couple of newbie questions.
>
> 1.  how do i delete a branch?

"rm -f .git/refs/heads/no-longer-needed". Make sure your working tree is not on that branch (i.e. .git/HEAD should not be pointing at it).

I have not introduced "git branch -d no-longer-needed" because I think that should do a bit more than "rm -f". For example:

 - making sure you are not on that branch (obvious),
 - check if all changes on that branch are included in the
   master branch or some other branch (easy if we hardcode "master";
   checking all other branches might be nicer but expensive).
 - otherwise tell the user this and that changes will be forever
   lost and get a confirmation before removing.
> 2.  is there a conventional place where branch description files reside?
No, but somebody proposed a convention a couple of days ago.
Daniel Barkalow· Sep 13, 2005, 16:23 UTC · re: Junio C Hamano · lore

Re: deleting a branch

On Tue, 13 Sep 2005, Junio C Hamano wrote:
Show 12 quoted lines
> "rm -f .git/refs/heads/no-longer-needed".  Make sure your
> working tree is not on that branch (i.e. .git/HEAD should not be
> pointing at it).
> 
> I have not introduced "git branch -d no-longer-needed" because
> I think that should do a bit more than "rm -f".  For example:
> 
>  - making sure you are not on that branch (obvious),
> 
>  - check if all changes on that branch are included in the
>    master branch or some other branch (easy if we hardcode "master";
>    checking all other branches might be nicer but expensive).

You could check HEAD. I think the most common cases would either be that you just created a branch from HEAD and changed your mind, or that you've just merged the branch into something. Other that that, I think the common case is that you've made patches, sent them off, and they were accepted. In the first two, you're probably on the branch that includes or matches the one you're deleting; on the third, we want user confirmation, since it's external to the system.

	-Daniel
*This .sig left intentionally blank*
Junio C Hamano· Sep 14, 2005, 08:46 UTC · re: Chuck Lever · lore

[PATCH] git-branch -d <branch>: delete unused branch.

The new flag '-d' lets you delete a branch. For safety, it does not lets you delete the branch you are currently on, nor a branch that has been fully merged into your current branch.

The credit for the safety check idea goes to Daniel Barkalow.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 git-branch.sh |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 54 insertions(+), 6 deletions(-)
6a714989f83ccb93188dc37791da8a0f2e32cabe
diff --git a/git-branch.sh b/git-branch.sh
--- a/git-branch.sh
+++ b/git-branch.sh
@@ -3,7 +3,7 @@
 . git-sh-setup || die "Not a git archive"
 
 usage () {
-    echo >&2 "usage: $(basename $0)"' [<branchname> [start-point]]
+    echo >&2 "usage: $(basename $0)"' [-d <branch>] | [<branch> [start-point]]
 
 If no arguments, show available branches and mark current branch with a star.
 If one argument, create a new branch <branchname> based off of current HEAD.
@@ -12,6 +12,59 @@ If two arguments, create a new branch <b
     exit 1
 }
 
+delete_branch () {
+    option="$1" branch_name="$2"
+    headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||')
+    case ",$headref," in
+    ",$branch_name,")
+	die "Cannot delete the branch you are on." ;;
+    ,,)
+	die "What branch are you on anyway?" ;;
+    esac
+    branch=$(cat "$GIT_DIR/refs/heads/$branch_name") &&
+	branch=$(git-rev-parse --verify "$branch^0") ||
+	    die "Seriously, what branch are you talking about?"
+    case "$option" in
+    -D)
+	;;
+    *)
+	mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ')
+	case " $mbs " in
+	*' '$branch' '*)
+	    # the merge base of branch and HEAD contains branch --
+	    # which means that the HEAD contains everything in the HEAD.
+	    ;;
+	*)
+	    echo >&2 "The branch '$branch_name' is not a strict subset of your current HEAD.
+If you are sure you want to delete it, run 'git branch -D $branch_name'."
+	    exit 1
+	    ;;
+	esac
+	;;
+    esac
+    rm -f "$GIT_DIR/refs/heads/$branch_name"
+    echo "Deleted branch $branch_name."
+    exit 0
+}
+
+while case "$#,$1" in 0,*) break ;; *,-*) ;; *) break ;; esac
+do
+	case "$1" in
+	-d | -D)
+		delete_branch "$1" "$2"
+		exit
+		;;
+	--)
+		shift
+		break
+		;;
+	-*)
+		usage
+		;;
+	esac
+	shift
+done
+
 case "$#" in
 0)
 	headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||')
@@ -36,11 +89,6 @@ case "$#" in
 esac
 branchname="$1"
 
-case "$branchname" in
--*)
-	usage;;
-esac
-
 rev=$(git-rev-parse --verify "$head") || exit
 
 [ -e "$GIT_DIR/refs/heads/$branchname" ] && die "$branchname already exists"
Chuck Lever· Sep 14, 2005, 14:54 UTC · re: Junio C Hamano · lore

Re: [PATCH] git-branch -d <branch>: delete unused branch.

what if you want to throw away work in a branch even if it's not merged? 
  doesn't the safety check prevent that?
Junio C Hamano wrote:
Show 99 quoted lines
> The new flag '-d' lets you delete a branch.  For safety, it does not
> lets you delete the branch you are currently on, nor a branch that
> has been fully merged into your current branch.
> 
> The credit for the safety check idea goes to Daniel Barkalow.
> 
> Signed-off-by: Junio C Hamano <junkio@cox.net>
> 
> ---
> 
>  git-branch.sh |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++------
>  1 files changed, 54 insertions(+), 6 deletions(-)
> 
> 6a714989f83ccb93188dc37791da8a0f2e32cabe
> diff --git a/git-branch.sh b/git-branch.sh
> --- a/git-branch.sh
> +++ b/git-branch.sh
> @@ -3,7 +3,7 @@
>  . git-sh-setup || die "Not a git archive"
>  
>  usage () {
> -    echo >&2 "usage: $(basename $0)"' [<branchname> [start-point]]
> +    echo >&2 "usage: $(basename $0)"' [-d <branch>] | [<branch> [start-point]]
>  
>  If no arguments, show available branches and mark current branch with a star.
>  If one argument, create a new branch <branchname> based off of current HEAD.
> @@ -12,6 +12,59 @@ If two arguments, create a new branch <b
>      exit 1
>  }
>  
> +delete_branch () {
> +    option="$1" branch_name="$2"
> +    headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||')
> +    case ",$headref," in
> +    ",$branch_name,")
> +	die "Cannot delete the branch you are on." ;;
> +    ,,)
> +	die "What branch are you on anyway?" ;;
> +    esac
> +    branch=$(cat "$GIT_DIR/refs/heads/$branch_name") &&
> +	branch=$(git-rev-parse --verify "$branch^0") ||
> +	    die "Seriously, what branch are you talking about?"
> +    case "$option" in
> +    -D)
> +	;;
> +    *)
> +	mbs=$(git-merge-base -a "$branch" HEAD | tr '\012' ' ')
> +	case " $mbs " in
> +	*' '$branch' '*)
> +	    # the merge base of branch and HEAD contains branch --
> +	    # which means that the HEAD contains everything in the HEAD.
> +	    ;;
> +	*)
> +	    echo >&2 "The branch '$branch_name' is not a strict subset of your current HEAD.
> +If you are sure you want to delete it, run 'git branch -D $branch_name'."
> +	    exit 1
> +	    ;;
> +	esac
> +	;;
> +    esac
> +    rm -f "$GIT_DIR/refs/heads/$branch_name"
> +    echo "Deleted branch $branch_name."
> +    exit 0
> +}
> +
> +while case "$#,$1" in 0,*) break ;; *,-*) ;; *) break ;; esac
> +do
> +	case "$1" in
> +	-d | -D)
> +		delete_branch "$1" "$2"
> +		exit
> +		;;
> +	--)
> +		shift
> +		break
> +		;;
> +	-*)
> +		usage
> +		;;
> +	esac
> +	shift
> +done
> +
>  case "$#" in
>  0)
>  	headref=$(readlink "$GIT_DIR/HEAD" | sed -e 's|^refs/heads/||')
> @@ -36,11 +89,6 @@ case "$#" in
>  esac
>  branchname="$1"
>  
> -case "$branchname" in
> --*)
> -	usage;;
> -esac
> -
>  rev=$(git-rev-parse --verify "$head") || exit
>  
>  [ -e "$GIT_DIR/refs/heads/$branchname" ] && die "$branchname already exists"
> 

begin:vcard fn:Chuck Lever n:Lever;Charles org:Network Appliance, Incorporated;Linux NFS Client Development adr:535 West William Street, Suite 3100;;Center for Information Technology Integration;Ann Arbor;MI;48103-4943;USA email;internet:cel@citi.umich.edu title:Member of Technical Staff tel;work:+1 734 763 4415 tel;fax:+1 734 763 4434 tel;home:+1 734 668 1089 x-mozilla-html:FALSE url:http://www.monkey.org/~cel/ version:2.1 end:vcard

Junio C Hamano· Sep 14, 2005, 16:15 UTC · re: Chuck Lever · lore

Re: [PATCH] git-branch -d <branch>: delete unused branch.

Chuck Lever <cel@citi.umich.edu> writes:
> what if you want to throw away work in a branch even if it's not merged? 
>  doesn't the safety check prevent that?

Yes. And you would get instructions on what to do from the command upon refusal.

← back to recent threads