如何在本地和远程删除Git分支

时间:2020-03-21 11:44:03  来源:igfitidea点击:

控制版本控制空间的一个工具就是GiT。
其受欢迎和被采用的原因有很多。
它本质上是分布式的,它是分散的,我们几乎可以在本地执行所有操作(这意味着仅在进行更改时才需要连接)。

git提供的另一个杀手级功能是“分支”。
尽管许多其他版本控制工具都提供了分支功能,但没有一个以git实现它的方式实现分支(这是非常轻量级的)。
与其他版本控制工具不同,在Git中,分支之间的切换非常快。

本文将深入探讨git中分支的删除操作。
不同的人对删除分支有不同的看法。
话虽如此,git用户之间的常见做法是删除已合并到主线开发中的分支(在大多数情况下为master分支。
这取决于git存储库结构。

删除分支是一个好主意,因为…

  • 它减少了存储库中的混乱情况
  • 一旦将我们从分支的更改合并到开发的主线中,它实际上就毫无用处,除非我们积极地将其用于进一步的开发。

话虽如此..请记住删除分支不会提高性能或者磁盘利用率(这是因为git分支只不过是指向特定提交ID的指针,即指向创建新分支的源分支的最后一个提交ID。

让我们创建一个包含少量测试文件的存储库,并创建和删除一些分支。

克隆存储库并创建几个分支

下面将克隆一个名为“ test-repo”的现有存储库。
好吧,这是我创建的用于纯粹说明目的的存储库。
它只有一个分支(即默认分支主节点),并且在该分支中有2个提交。

$git clone https://gitlab.example.com/sarath/test-repo.git
Cloning into 'test-repo'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.

克隆存储库后,让我们进入test-repo目录,并查看我们所在的提交和当前分支。

$git log --oneline
0807c9a (HEAD -> master, origin/master, origin/HEAD) Adding test files a b c
ebd0b69 Initial commit


HEAD指向master,意思是我们现在在master的分支里面。上面的命令还向我们展示了这个主分支中有两个提交,以及它们各自的提交消息。

现在让我们在该存储库中创建一个分支。
这可以通过运行以下命令来实现。

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

上面显示的命令将创建一个名为testbranch1的分支,并将我们带入该新分支。
从现在开始所做的任何工作都将成为这个新分支的一部分。
实际上创建一个分支并进入该分支是两个单独的命令。

命令“git branch testbranch1”将创建分支命令“git checkout testbranch1”将带您进入该分支命令“git checkout-b testbranch1”是创建分支并进入新分支的快捷方式-基本上是一个命令而不是上面两个命令。

通过运行以下任何命令,可以确认我们是否确实在新分支内。
HEAD现在应该指向testbranch1,而不是我们前面看到的master。

$git log --oneline
0807c9a (HEAD -> testbranch1, origin/master, origin/HEAD, master) Adding test files a b c
ebd0b69 Initial commit
$git branch
  master
* testbranch1

现在,让我们进行一些更改并进行提交。

$touch d e f
$git add .
$git commit -a -m "Adding test files d e f"
[testbranch1 1a0751b] Adding test files d e f
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 d
 create mode 100644 e
 create mode 100644 f
$git push origin testbranch1
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 297 bytes | 297.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To https://gitlab.example.com/sarath/test-repo.git
 * [new branch]      testbranch1 -> testbranch1


如上图所示,我们创建了3个新的测试文件,添加并提交了它们,然后推送了它。推送操作将在远程存储库中创建这个新分支及其相关历史记录。

一旦将testbranch1的更改合并到master分支,就应该能够从本地以及远程删除testbranch1,因为如果以后不进行任何操作,这将毫无用处。

让我们继续进行,将我们的testbranch1合并到master。
这可以通过首先切换到master分支,然后执行merge命令来完成。
见下文。

$git checkout master
$git merge testbranch1


如果您使用的是github或gitlab之类的东西,那么不允许在没有请求和检查的情况下直接合并。我这里没有使用任何pull请求和检查过程,因为这纯粹是为了说明。

现在我们的master分支应该具有testbranch1的所有更改。
现在,我们可以从本地以及远程删除我们的testbranch1.

如何在本地删除GiT分支?

我们可以通过使用-d选项执行git branch命令来在本地删除git分支。
请记住,这只会从本地存储库中删除该分支。
见下文。

$git branch -d testbranch1
Deleted branch testbranch1 (was 1a0751b).

上面显示的命令有一个有趣的方面。如果分支(testbranch1)的内容被合并到创建它的原始分支(在我们的例子中是主分支),它将只删除该分支

如果所做的更改未合并到创建时所在的原始分支中,则会引发如下所示的错误。

error: The branch 'testbranch1' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testbranch1'

正如上面的输出中所提到的,您仍然可以使用-D选项强制删除具有尚未合并的更改的分支。

如何删除GiT远程分支?

如前所述,上面显示的方法只会从本地存储库中删除分支。
要使用命令行从远程存储库中删除分支,我们需要执行git push命令,如下所示。

$git push origin :testbranch1
To https://gitlab.example.com/sarath/test-repo.git
 - [deleted]         testbranch1

另外,我们也可以执行以下命令,执行相同的操作。

$git push origin -d testbranch1
To https://gitlab.example.com/sarath/test-repo.git
 - [deleted]         testbranch1

要记住的一件重要事情是。如果有服务器或其他计算机正在跟踪此存储库(我们从中删除了一个分支),则它们必须再次克隆存储库,或者使用git fetch命令执行修剪操作。