在本地和远程删除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分支。