Contents

在本地和远程删除git分支

1. 概述

Git 已被广泛用作业界的版本控制系统。此外,Git 分支是我们日常开发过程的一部分。 在本教程中,我们将探讨如何删除 Git 分支。

2. Git 存储库的准备

为了更容易解决如何删除 Git 分支,让我们首先准备一个 Git 存储库作为示例。

首先,让我们从 GitHub 克隆myRepo存储库(https://github.com/sk1418/myRepo ) 进行测试:

$ git clone [[email protected]](/cdn_cgi/l/email_protection):sk1418/myRepo.git
Cloning into 'myRepo'...
...
remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done

其次,我们进入本地myRepo目录,查看分支:

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

从上面的输出中我们可以看到,目前,我们在myRepo存储库中只有一个master 分支。此外,master分支是myRepo的默认分支。**

接下来,让我们创建一些分支并展示如何在本地和远程删除分支。在本教程中,我们将专注于在命令行中删除分支。

3. 删除本地分支

我们先来看看删除本地分支。

Git 的 git branch 命令有两个用于删除本地分支的选项:-d-D。**

接下来,让我们仔细看看它们,并通过一个例子来了解这两个选项之间的区别。

3.1. 使用*-d*选项删除本地分支

首先,让我们尝试创建一个本地分支:

$ git checkout -b feature
Switched to a new branch 'feature'

接下来,让我们使用*-d选项删除feature*分支:

$ git branch -d feature
error: Cannot delete branch 'feature' checked out at '/tmp/test/myRepo'

糟糕,正如我们所见,我们收到了一条错误消息。这是因为我们目前在 feature分支上:

$ git branch
* feature
  master

**换句话说,我们不能删除当前签出的分支。**所以,让我们切换到master分支并再次触发命令:

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git branch -d feature
Deleted branch feature (was 3aac499)
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

如我们所见,我们已经成功删除了本地feature分支。

3.2. 使用*-D*选项删除本地分支

首先,让我们再次创建feature分支。但这一次,我们将进行一些更改并提交:

$ git checkout -b feature
Switched to a new branch 'feature'
# ... modify the README.md file ...
$ echo "new feature" >> README.md
$ git status
On branch feature
Changes not staged for commit:
...
	modified:   README.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git ci -am'add "feature" to the readme'
[feature 4a87db9] add "feature" to the readme
 1 file changed, 1 insertion(+)

现在,如果我们仍然使用*-d选项,Git 将拒绝删除feature*分支:

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git branch -d feature
error: The branch 'feature' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature'.

**这是因为要删除的分支(feature)在默认分支(master)**之前:

$ git log --graph --abbrev-commit 
* commit 4a87db9 (HEAD -> feature)
| Author: ...
| Date:   ...| 
|     add "feature" to the readme
| 
* commit 3aac499 (origin/master, origin/HEAD, master)
| Author: ...
| Date:   ...| 
|     the first commit
| 
* commit e1ccb56
  Author: ...
  Date:   ...  
      Initial commit

有两种方法可以解决问题。首先,我们可以将feature分支合并到master中,然后再次执行“ git branch -d feature ”。

但是,如果我们想丢弃未合并的提交,正如错误消息提示的那样,我们可以运行“ git branch -D feature ”来执行强制删除:

$ git branch -D feature
Deleted branch feature (was 4a87db9)
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master.

3.3. git branch -d/-D不会删除远程分支

到目前为止,我们已经使用 带有*-d-D选项的git branch删除了一个本地分支。值得一提的是,无论我们使用-d*还是 -D删除,该命令都只会删除本地分支。不会删除任何远程分支,即使已删除的本地分支正在跟踪远程分支

接下来,让我们通过一个例子来理解这一点。同样,让我们创建一个 feature分支,进行一些更改,然后将提交推送到远程存储库:

$ git checkout -b feature
Switched to a new branch 'feature'
# add a new file
$ echo "a wonderful new file" > wonderful.txt
$ git add . && git ci -am'add wonderful.txt'
[feature 2dd012d] add wonderful.txt
 1 file changed, 1 insertion(+)
 create mode 100644 wonderful.txt
$ git push
...
To github.com:sk1418/myRepo.git
 * [new branch]      feature -> feature

如上面的输出所示,我们在feature分支上创建了一个新文件,wonderful.txt,并将提交推送到远程存储库。

因此,本地 feature分支正在跟踪远程feature分支:

$ git remote show origin | grep feature
    feature tracked
    feature pushes to feature (up to date)

由于我们还没有将feature合并到 master中,让我们使用*-D*选项删除本地特性分支 :

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
$ git branch -D feature
Deleted branch feature (was 2dd012d).
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature
  remotes/origin/master

正如我们在命令git branch -a的输出中看到的那样,本地feature分支消失了。但是*/remotes/origin/feature*分支没有被删除。

现在,如果我们再次检查feature分支,我们所做的更改仍然存在:

$ git checkout feature
Switched to branch 'feature'
Your branch is up to date with 'origin/feature'.
$ cat wonderful.txt 
a wonderful new file

接下来,让我们看看如何删除远程分支。

4. 删除远程分支

如果我们的 Git 版本在 1.7.0 之前,我们可以使用命令git push origin :branchName删除远程分支。但是,这个命令看起来不像是删除操作。因此,从 1.7.0 版本开始,Git 引入了git push origin -d branchName命令来删除远程分支。显然,这个命令比旧版本更容易理解和记忆。

刚才,我们已经删除了本地分支feature,我们看到远程feature分支还在。所以现在,让我们使用上面提到的命令来删除远程feature分支。

在我们删除远程feature之前,让我们先创建一个本地feature分支来跟踪远程功能。这是因为我们要检查删除远程分支是否会影响对本地分支的跟踪:

$ git checkout feature 
branch 'feature' set up to track 'origin/feature'.
Switched to a new branch 'feature'
$ git branch -a
* feature
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/feature
  remotes/origin/master

所以,现在我们有了本地和远程feature分支。此外,我们目前在本地feature分支上。

接下来,让我们删除远程feature分支:

$ git push origin -d feature
To github.com:sk1418/myRepo.git
 - [deleted]         feature
$ git branch -a
* feature
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

可以看到,执行 git push -d feature命令后,远程feature分支已经被删除。但是,本地feature分支仍然存在。也就是说,删除远程分支不会影响本地跟踪分支。因此,如果我们现在启动 git push,本地feature分支将再次被推送到远程。

此外,与本地分支删除不同的是,无论我们当前正在处理哪个本地分支,我们都可以删除远程分支。在上面的示例中,我们在本地feature分支上,但我们仍然可以毫无问题地删除远程feature分支。