Branches can be deleted, to get rid of them when they are no longer needed.
Deleting a branch deletes the corresponding branch ref from the revision history (it does not delete any commits). The impact of the loss of the branch ref depends on whether the branch has been merged.
When you delete a branch that has been merged, the commits of the branch will still exist in the history and will be safe. Only the branch ref is lost.
gitGraph BT: %%{init: { 'theme': 'default', 'gitGraph': {'mainBranchName': 'master'}} }%% commit id: "m1" branch bug-fix checkout bug-fix commit id: "[bug-fix] b1" checkout master merge bug-fix id: "[HEAD → master] mc1"
→
[delete branch bug-fix
]
gitGraph BT: %%{init: { 'theme': 'default', 'gitGraph': {'mainBranchName': 'master'}} }%% commit id: "m1" branch bug-fix checkout bug-fix commit id: "b1" checkout master merge bug-fix id: "[HEAD → master] mc1"
In the above example, the only impact of the deletion is the loss of the branch ref bug-fix
. All commits remain reachable (via the master
branch), and there is no other impact on the revision history.
In fact, some prefer to delete the branch soon after merging it, to reduce branch references cluttering up the revision history.
When you delete a branch that has not been merged, the loss of the branch ref can render some commits unreachable (unless you know their commit IDs or they are reachable through other refs), putting them at risk of being lost eventually.
gitGraph BT: %%{init: { 'theme': 'default', 'gitGraph': {'mainBranchName': 'master'}} }%% commit id: "[HEAD → master] m1" branch bug-fix checkout bug-fix commit id: "[bug-fix] b1" checkout master
→
[delete branch bug-fix
]
gitGraph BT: %%{init: { 'theme': 'default', 'gitGraph': {'mainBranchName': 'master'}} }%% commit id: "[HEAD → master] m1" branch _ checkout _ commit id: "b1" checkout master
In the above example, the commit b1
is no longer reachable, unless we know its commit ID (i.e., the SHA
).
SIDEBAR: What makes a commit 'unreachable'?
Recall that a commit only has a pointer to its parent commit (not its descendent commits).
A commit is considered reachable if you can get to it by starting at a branch, tag, or other ref and walking backward through its parent commits. This is the normal state for commits — they are part of the visible history of a branch or tag.
When no branch, tag, or ref points to a commit (directly or indirectly), it becomes unreachable. This often happens when you delete a branch or rewrite history (e.g., with reset or rebase), leaving some commits "orphaned" without a name pointing to them.
In the example below, C4
is unreachable (i.e., cannot be reached by starting at any of the three refs: v1.0 or master or ←HEAD), but the other three are all reachable.
Unreachable commits are not deleted immediately — Git keeps them for a while before cleaning them up. By default, Git retains unreachable commits for at least 30 days, during which they can still be recovered if you know their SHA. After that, they will be garbage-collected, and will be lost for good.
0 First, create the repo samplerepo-books-2
for this hands-on practical, by running the following commands in your terminal.
mkdir samplerepo-books-2
cd samplerepo-books-2
git init
echo "Horror Stories" >> horror.txt
git add .
git commit -m "Add horror.txt"
git switch -c textbooks
echo "Textbooks" >> textbooks.txt
git add .
git commit -m "Add textbooks.txt"
git switch -c fantasy master
echo "Fantasy Books" >> fantasy.txt
git add .
git commit -m "Add fantasy.txt"
git checkout master
git merge --no-ff -m "Merge branch textbooks" textbooks
1 Delete the (the merged) textbooks
branch.
Use the git branch -d <branch>
command to delete a local branch 'safely' -- this command will fail if the branch has unmerged changes.
git branch -d textbooks
git log --oneline --decorate --graph --all # check the current revision graph
* 443132a (HEAD -> master) Merge branch textbooks
|\
| * 4969163 Add textbooks.txt
|/
| * 0586ee1 (fantasy) Add fantasy.txt
|/
* 7f28f0e Add horror.txt
Right-click on the branch name and choose Delete <branch>
:
In the next dialog, click OK
:
Observe that all commits remain. The only missing thing is the textbook
ref.
2 Make a copy of the SHA
of the tip of the (unmerged) fantasy
branch.
3 Delete the fantasy
branch..
Attempt to delete the branch. It should fail, as shown below:
git branch -d fantasy
error: the branch 'fantasy' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D fantasy'
As also hinted by the error message, you can replace the -d
with -D
to 'force' the deletion.
git branch -D fantasy
Now, check the revision graph:
git log --oneline --decorate --graph --all
* 443132a (HEAD -> master) Merge branch textbooks
|\
| * 4969163 Add textbooks.txt
|/
* 7f28f0e Add horror.txt
Attempt to delete the branch as you did before. It will fail because the branch has unmerged commits.
Try again but this time, tick the Force delete
option, which will force Git to delete the unmerged branch:
Observe how the branch ref fantasy
is gone, together with any unmerged commits on it.
4 Attempt to view the 'unreachable' commit whose SHA
you noted in step 2.
e.g., git show 32b34fb
(use the SHA
you copied earlier)
Observe how the commit still exists and still reachable using the commit ID, although not reachable by other means, and not visible in the revision graph.