Git
git branch

git branch 命令:创建、删除、签出、列表、更改名称、选项

在这篇文章中,我们将介绍如何正确理解分支,以及如何使用git branch命令创建、删除、更改、验证、重命名和其他选项。

1. 了解git分支

分支是Git中协作的一个关键特征。 在传统的文件系统中,如果你想同时修改同一个文件,唯一的办法就是复制,分别修改,然后再手动合并到一起。 有了分支,Git 可以在同一时间对同一个文件进行不同的操作,几乎就像一个多元宇宙。

这个有用的功能背后的原理其实很简单。 在之前的 git addgit commit 帖子中,我们提到,一个存储单个提交信息的提交对象,其父级提交有一个 ID。 提交历史最终是由每个提交的父提交ID链接起来的。

一个分支只是一个名称标签,它指向这个提交历史中的最新提交。 如果我们在 main分支工作,分支名main就有当前提交历史中的最后一个提交ID。

这看起来像下面的图片

git main分支描述1

由于提交 B 知道提交 A 的 ID 2b89,这两个提交可以通过历史记录联系起来。 由于名为 main的分支知道提交B的ID,即 991b,它是该历史中的最后一个提交,所以我们称当前分支为 main

如果我们在当前分支中做一个新的提交,main标签中的最后一个提交ID将变为新的提交ID。

这看起来就像下面这样

git main branch description 2

这样一来,最后一次提交的 ID 就成了实现分支功能的唯一信息。 而且,即使是改变分支,我们在下一节也会看到,只是根据分支列表中的iD跳转到相应的提交而已。

如果我们要创建一个新的分支,并对该分支进行新的提交,它看起来会是这样的

git main branch description 3

如果您在 main分支中创建一个名为 topicA的新分支,maintopicA都会指向 v274。当你在topicA分支中创建一个新的提交时,topicA分支会变为指向提交D的ID1g8c

在这种情况下,切换到 main分支就会指向提交C,而切换回 topicA分支就会指向提交D。要记住,分支是最后一个提交ID的名称标签。

2. 获取本地和远程分支的列表

查看当前本地版本库中所有分支的命令是

$ git branch

在这种情况下,标有 "*"的分支是当前工作分支。执行的结果将是

git分支执行结果

git 分支列表命令可以使用-r-a选项。使用它们可以只打印远程分支,或同时打印本地和远程分支。

使用它们的方法如下

运行git分支选项的结果

3. 创建一个新的分支

要创建一个与当前分支指向同一提交的新分支,有三个命令可以使用,但略有不同。

首先,下面的命令是最基本的分支创建命令。

$ git branch <new-branch-name>

第二个命令是创建一个分支,然后立即移动到它。你可以跳过创建然后再移动的步骤。

$ git checkout -b <new-branch-name>

最后一条命令比checkout要新,产生的结果也一样。这是推荐的方法。

 $ git switch -c <new-branch-name>

以下是执行的结果

git switch -c execution result

在按照描述创建了一个新的分支后,对该分支进行了修改。

4. 将远程分支复制到本地环境

要把在远程仓库中创建的分支复制到本地环境,可以在 checkoutswitch命令中使用t选项。如果你没有指定一个新的分支名称,它将以与远程分支相同的名称被复制。

$ git checkout -t <remote-name>/<branch-name>

$ git switch -c <new-branch-name> -t <remote-name>/<branch-name>

以下是执行的结果

git switch -c -t run result

在你的本地环境中,已经创建了一个feature-a分支,跟踪远程 repo 中的feature-a分支。

5. 移动到变更分支

有两个命令可以用来改变你正在工作的分支。checkout是一个传统的命令,它不仅可以导航到分支,还可以导航到提交、标签和其他标准。switch是一个相对较新的命令,只为分支操作而生。为了安全使用 Git,我们建议使用功能有限的 switch 命令。

下面是这两个命令的使用方法

$ git checkout <branch-name>

$ git switch <branch-name>

这是执行的结果 git checkout, switch执行结果

6. 如何删除和撤销一个分支

有两种方法可以删除一个Git分支。第一种是删除一个已经被合并的分支,第二种是删除一个尚未被合并的分支。

6.1. 删除一个分支

删除一个已经合并的分支的命令如下。你不能删除我目前正在工作的这个分支,所以请到另一个分支去输入它。

$ git branch -d <branch-name-merged>

在这种情况下,合并后的提交以你要删除的分支的最后一个提交ID作为其父级提交ID。因此,属于该分支的所有提交都将保留在这个 repo 的提交历史中。

以下是删除一个尚未合并的分支的命令。

$ git branch -D <branch-name-not-merged>

在这种情况下,属于你要删除的分支的提交的指针就会消失。 这就是所谓的悬空或无主的提交状态,Git 的垃圾回收器会负责清理这些无法访问的提交。

首先,让我们看看删除一个合并分支的结果。

合并后删除分支的结果

上面的git日志图显示,我们将feature-c分支合并到develop分支。 如果你删除feature-c分支,再打印日志图,feature-c分支就不见了,但该分支的提交仍在历史中。

这是因为合并后的提交 0dd7b0bdevelop分支的提交 80d10f1feature-c分支的提交 8480ae1的ID都相同。

以下是删除未合并的分支的结果

git branch -D execution result

如果你看上面的日志图,可以看到我们在develop分支中创建了一个新的feature-d分支,并做了一次新的提交。然后我们删除了feature-d分支,但没有合并它,它就从日志图中消失了。

6.2. 取消删除一个分支

最后,让我们来看看如何撤销一个被你不小心删除的分支。你可能已经注意到了,删除分支的命令会打印出一条成功信息和该分支所指向的最后一次提交ID。 例如,Deleted branch feature-d (was 3a31806)信息中的 3a31806。你可以在上面的截图中看到这一点。

要撤销一个分支,你需要使用这样一个提交ID。该命令看起来像这样 把提交ID放在<base-commit-id>部分。

$ git branch <branch-name> <base-commit-id>

让我们用这个命令恢复上面我们删除的两个分支

git branch undelete result

提交历史会是这样的

git branch undelete result 2

你可以看到,feature-cfeature-d 分支已经从之前的位置复活了。

6.3. 删除一个远程分支

所有的Git托管服务都支持通过GUI删除远程分支,但你也可以通过命令来删除它。

该命令看起来像这样。

$ git push <remote-name> --delete <branch-name>

这就是运行的结果

git push origin --delete run result

如果您的本地环境中有一个跟踪您所删除的远程分支的分支,它不会被一并删除。请使用我们在第6节1中学到的命令删除它。

7. 总结

git分支命令是同时处理多个项目的基础,我们所讲的就是这些概念。我希望这篇文章能帮助你理解并正确使用分支。

copyright for git branch

© 2023 All rights reserved.