Git 是在编码项目中实施版本控制的绝佳方式–事实上,它是如此绝妙,以至于几乎成了必选项。
其原理是在主版本库中创建重复的分支,对代码进行修改,然后将修改与其他分支合并。这意味着你的版本库中会有很多旧的分支。虽然这些分支的文件大小通常不大,但您仍需要在本地分支上执行 git delete
操作,以保持整洁。
好在这并不费力。不过,您需要根据是否合并变更以及在删除过程中出错时该如何处理来考虑最佳方法。您甚至可能需要恢复删除的分支。每种情况都需要不同的技能和命令。
在本教程中,我们将向您演示如何在本地分支上执行 git 删除操作。首先,我们要谈谈你想在 Git 中删除本地分支的一些原因。
什么是 Git 分支?
Git 仓库是分支的集合,也就是核心代码的副本。事实上,没有分支就没有一个正常运行的 Git 仓库。
通常,你会有一个主仓库(名义上的名称是 “main” 和 “trunk”)。主仓库中包含的是您不想编辑的生产代码。相反,你会在主版本库中创建一个复制分支,然后在你的分支中进行你需要的修改。当需要将这些更改带回核心代码时,你就需要检查并合并它们。
分支让团队中的每个人都能在同一个项目中独立协作。在此期间,也不会有修改工作代码或踩踏其他修改的危险。
不过,您也需要在本地分支上执行 git delete
操作。这将是您的一项常规操作,而且这样做有很多充分的理由。
为什么要在 Git 中移除分支?
您的生产代码会在主分支中。这也是唯一一个具有永久性的分支。
相比之下,你创建的其他分支几乎都是临时性的。一旦你完成了工作,你就会提交修改,然后将它们与主分支合并,可能是在 GitHub 等在线仓库中合并。
这意味着,根据项目和团队的不同,你往往会同时打开很多分支。但是,一旦完成合并,这些分支并不会消失。
因此,有几个原因需要删除本地 Git 分支:
- 一般内务整理:在家里,当你做完饭,你会清洗餐具并把它们放好。使用 Git 仓库也是一样: 当你完成工作时,你会合并改动并删除任何你不再需要的分支。这也会让你的项目和仓库更容易浏览。
- 版本库文件大小:虽然 Git 仓库通常很小,对项目的大小影响不大,但你还是应该留意一下。缩小版本库大小的方法之一就是删除不需要的分支。
- 潜在性能:即使你的核心代码性能很好,但考虑到你正在处理的分支,它的性能可能并不好。因此,你应该尽量减少开放分支。否则,在你对项目进行阶段性调整之前,它可能会给你的团队带来糟糕的性能。
正如你稍后会看到的,在本地分支上执行 git delete
在大多数情况下都很简单。不过,在使用这条命令时,最好还是先了解一下它的原理,因为它并不能清除 repo 中与该分支相关的所有内容。
删除本地 Git 分支会怎样?
从技术层面上讲,分支只是指向特定提交的指针,也就是你想包含在主分支中的一段代码。因此,当你删除本地 Git 分支时,提交仍会保留。
稍后,我们将讨论分支恢复,以及由于这些提交仍保留在版本库中而可能出现的情况。现在,请先了解有两种不同类型的变更:
- 合并变更:一旦你将一个分支与主分支合并,代码就会尽可能保持最新。用技术术语来说,这就相当于移动主分支的引用,以赶上你的辅助分支。
- 未合并的变更:如果不合并变更,就会有一个分支不如主分支最新。这样,主分支就没有最新的参考提交。
这一点我们稍后会详细讨论。无论如何,这也是关于何时删除分支的另一个要点。
何时对本地分支执行 Git Delete
考虑到删除带有未合并改动的分支的危险性,在进行代码合并之前,不要在本地分支上运行 git delete
是很重要的。这将确保每个分支都有最新的引用,进而确保最新的代码可用。
另外,在执行 git delete
之前,最好确保临时分支中的任何提交都不再需要。虽然您可以在一定程度上恢复分支,但这并不是您需要时才会做的工作。稍后我们将对此进行深入介绍。
如何在本地分支上执行 Git Delete
在本教程的其余部分,我们将向你展示如何在本地分支上执行 git delete
操作。我们还会讨论如何处理未合并的变更。
接着,我们会讨论可能会出现的错误,以及如何恢复已删除的本地分支。
最后,我们将简要介绍远程分支以及如何删除它们。
先决条件
Git 本身提供了一套简单的命令集,无需翻开教科书就能为你提供强大的功能。即便如此,访问 Git 仓库还是有几种不同的方式,这取决于你选择的应用程序和代码编辑器。
虽然你可以在 GitKraken 或 Sublime Merge 等专用图形用户界面(GUI)中找到 “minimal click” 设置,但我们将保持简单,使用操作系统内置的工具。
要继续学习,你需要具备以下条件:
- 命令行访问权限:我们的示例将使用 macOS 和 iTerm。不过,你也可以使用 Windows 的 Cmder、macOS 的默认终端、Linux 的默认终端等。
- 访问特定文件:你需要在本地电脑上保存项目文件,因为没有这些文件,你将无计可施!
- 命令行知识:掌握一些命令行知识会有帮助–具体来说,就是帮助你浏览文件的命令,以及对命令行工作原理的一些了解。
实际上,只要你有一个 Git 仓库和一个终端窗口,这就足够了。
执行基本的 Git Delete 操作
首先,我们假设你想删除一个已合并变更的分支。这是最直接、最典型的做法。
不过,您可能需要运行 git branch -a
或 git branch --list
来查看所有分支,并在您的仓库中找到正确的分支:
列出本地 Git 仓库中的分支
下面是删除分支所需的命令:
git branch -d branch-name
你需要使用具体的分支名称,而不是我们的占位符。
这里的 -d
标志代表 “删除”,如果使用小写形式,就可以防止删除有未合并修改的分支。
如果你尝试删除一个未合并的分支,你会看到一个错误(其实更像是一个警告):
试图删除 Git 仓库中带有未合并变更的分支
不过,你可以使用 -D
将标记大写,跳过这个保护性警告。这样,你就可以删除有未合并变更的分支了。
需要注意的是,如果使用大写版本,删除分支时将不会得到确认,因此需要谨慎使用。
什么原因导致 “无法删除分支” 错误?
因为删除仓库分支是一个重大决定,没有简单的解决方法,所以如果您做错了,Git 就会出错。
例如,有时你在本地分支上执行 git delete
操作时,会看到 “Cannot delete branch” 的错误提示:
试图删除 Git 仓库中的某个分支时报错
原因很简单,你在 Git 仓库中的当前位置造成的。你无法删除 “check out” 的分支。
解决办法是转移到另一个分支。
因此,我们建议您 check out main
分支。这样,如果你试图删除 main
分支,就会出现错误,而且还能清除版本库中的其他分支。
如何恢复已删除的本地 Git 分支
鉴于删除本地分支后仍会保留提交,因此在执行git delete
操作后仍有少量机会恢复分支。不过,这比先合并这些变更要麻烦得多。在这种情况下,你就会知道自己不再需要某个分支了。
每个提交都有一个哈希值,作为其参考。你可以使用哈希值签出并创建一个新的分支:
显示 Git 中某个提交的参考哈希值的长短版本
不过,如果不知道已删除分支的哈希值,可以使用 reflog
命令。这些 “reference logs” 很像一些本地开发工具等应用中的日志。
虽然使用 git reflog
完全是另一篇文章的话题,但你可以使用基本功能来查找旧提交的哈希值。运行 git reflog
,你会看到一个提交列表:
运行 git reflog 命令并输出结果的终端窗口
通过第一列哈希值,您可以签出提交并创建一个新分支。例如
git checkout 5744ff6
git branch f9d2db5
不过,在 Git 中恢复已删除的分支并非万无一失。
在某些情况下,reblog 中没有提交,也没有 HEAD
引用。因此,在本地分支上执行 git delete
之前,最好先合并变更,这样才能更安全地处理分支。
使用远程 Git 分支
在本地分支上执行 git delete
操作时,通常会关联到一个远程 repo。尤其是在使用 Git 将网站拉到远程服务器的情况下。
不过,GitHub 和 GitLab 都有删除远程 Git 分支的相同流程。这与其他向上游推送的方法类似。
命令如下:
git push remote-name -d remote-branch
对于 remote-name
,我们看到的大多数版本库都使用 “origin”。remote-branch
的引用将与本地分支相同(除非你重命名了本地分支,这超出了本文的讨论范围)。
另外,使用 git branch -a
可以查看所有分支,包括本地和远程分支。如果只想看远程分支,可以用 git branch -r
。
运行该命令后,你会看到一条确认信息,这时你应该再运行一次 git branch -a
,检查是否如你所料删除了所有分支。
小结
Git 是为数不多的能通过可读、直观的命令为你提供强大功能的工具之一。这同样适用于删除本地机器上不再需要的分支。不过,在本地分支上运行 git 删除时仍需谨慎。
因为如果试图删除未合并的变更,要么会出错,要么会删除一些会影响未来项目工作的内容。此外,您还需要删除远程分支。本地和远程版本库都需要你进行良好的内务管理,以保持较高的性能和最小的文件大小。
原文地址:https://www.wbolt.com/git-delete-local-branch.html