介绍

在我们日常使用git进行开发过程中,有可能不小新创建了一些含义难言或者没有含义的分支,这会对我们的开发造成不便,下面介绍下如何删除分支。

案例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 G:\mygitea\GitLearn\learn03   dab1693 
$ git branch -av
* dab1693 41f7a2f Second commit
master 41f7a2f Second commit

G:\mygitea\GitLearn\learn03   dab1693 
$ git branch -d dab1693
error: Cannot delete branch 'dab1693' checked out at 'G:/mygitea/GitLearn/learn03'

G:\mygitea\GitLearn\learn03   dab1693 
$ git checkout master
Switched to branch 'master'

G:\mygitea\GitLearn\learn03   master 
$ git branch -d dab1693
Deleted branch dab1693 (was 41f7a2f).

通过git branch -d [分支对应的commit id]来删除分支。此外,需要注意,删除分支时工作目录指针不能位于分支上。

案例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 G:\mygitea\GitLearn\learn01   fix_readme 
$ git branch -av
checkout 5bc7fdf rename test
fix_css 9fa98d6 change background color
* fix_readme 9fa98d6 change background color
master 5bc7fdf [ahead 2] rename test
temp e1514cf test1
remotes/origin/master b390c28 add modified html css

G:\mygitea\GitLearn\learn01   fix_readme 
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)

G:\mygitea\GitLearn\learn01   master 
$ git branch -d fix_readme
error: The branch 'fix_readme' is not fully merged.
If you are sure you want to delete it, run 'git branch -D fix_readme'.

如果确实不想要分支上的修改内容合并到原始分支,则运行git branch -D xxx命令直接删除。

1
2
3
4
5
6
7
8
9
10
11
 G:\mygitea\GitLearn\learn01   master 
$ git branch -D fix_readme
Deleted branch fix_readme (was 9fa98d6).

G:\mygitea\GitLearn\learn01   master 
$ git branch -av
checkout 5bc7fdf rename test
fix_css 9fa98d6 change background color
* master 5bc7fdf [ahead 2] rename test
temp e1514cf test1
remotes/origin/master b390c28 add modified html css

总结

从官网文档上了解-d的话必须已经将分支完全合并到其上游分支或者HEAD中,否则不能成功。分支比较好理解,HEAD的场景工作中比较少遇到,比较不容易理解,所以我还特意在本地做了一个实验,实验前置条件:从master分支创建了一个新分支test,并在test产生一个commit,然后切回master分支,此时test是领先master一个commit的。 按照理解test直接用-d是删不掉的,那如何调整HEAD呢?利用前面学习的分离头指针!直接使用git checkout 'test的commitID',这个时候git log --all --graph可以看到HEAD和test在同一个commit上,此时再次使用git branch -d test,奇迹发生了,成功删除了test分支。

补充:

要想恢复删除的分支:

https://stackoverflow.com/questions/3640764/can-i-recover-a-branch-after-its-deletion-in-git 可以再了解一下 git reflog 这个命令的作用。