章节 ▾ 第二版

3.3 Git 分支 - 分支管理

分支管理

既然你已经创建、合并并删除了一些分支,让我们来看看一些分支管理工具,当你开始频繁使用分支时,这些工具会非常有用。

git branch 命令不仅仅能创建和删除分支。如果不带任何参数运行它,你会得到当前分支的简单列表:

$ git branch
  iss53
* master
  testing

注意 master 分支前的 * 字符:它表示你当前所在的分支(即 HEAD 指向的分支)。这意味着如果你此时进行提交,master 分支将随你的新工作向前推进。要查看每个分支的最后一次提交,可以运行 git branch -v

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

实用的 --merged--no-merged 选项可以筛选出已经合并到当前分支或尚未合并到当前分支的分支列表。要查看哪些分支已经合并到当前分支,可以运行 git branch --merged

$ git branch --merged
  iss53
* master

因为你之前已经合并了 iss53,所以它会出现在列表中。列表中前面没有 * 的分支通常可以使用 git branch -d 安全删除;因为你已经将它们的工作整合到了另一个分支中,所以不会丢失任何东西。

要查看所有包含尚未合并工作的分支,可以运行 git branch --no-merged

$ git branch --no-merged
  testing

这会显示你的其他分支。因为它包含尚未合并的工作,尝试用 git branch -d 删除它将会失败:

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

如果你确实想要删除该分支并丢弃这些工作,可以使用 -D 参数强制删除,正如帮助信息所提示的那样。

提示

上述提到的 --merged--no-merged 选项,如果不提供提交或分支名称作为参数,将分别显示已合并或未合并到你“当前”分支的内容。

你可以随时提供额外的参数来查询相对于其他分支的合并状态,而无需先切换到该分支,例如:什么尚未合并到 master 分支?

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

更改分支名称

警告

不要重命名其他协作者仍在使用中的分支。在阅读 更改 master 分支名称 章节之前,不要重命名像 master/main/mainline 这样的分支。

假设你有一个名为 bad-branch-name 的分支,想要将其更改为 corrected-branch-name,同时保留所有历史记录。你还希望更改远程仓库(GitHub、GitLab 或其他服务器)上的分支名称。该如何操作?

使用 git branch --move 命令在本地重命名分支:

$ git branch --move bad-branch-name corrected-branch-name

这会将你的 bad-branch-name 替换为 corrected-branch-name,但这仅在本地生效。要让其他人看到远程仓库上已更正的分支,请推送它:

$ git push --set-upstream origin corrected-branch-name

现在我们简要看一下目前的状态:

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

注意,你现在处于 corrected-branch-name 分支,并且它已在远程上可用。但是,旧名称的分支仍然存在,你可以通过执行以下命令将其删除:

$ git push origin --delete bad-branch-name

现在,旧的分支名称已完全被更正后的分支名称所取代。

更改 master 分支名称

警告

更改像 master/main/mainline/default 这样的分支名称会破坏你的仓库所使用的集成、服务、辅助工具以及构建/发布脚本。在执行此操作之前,请务必咨询你的协作者。此外,请确保对你的仓库进行彻底搜索,并更新代码和脚本中对旧分支名称的所有引用。

使用以下命令将本地 master 分支重命名为 main

$ git branch --move master main

现在不再有本地 master 分支了,因为它已被重命名为 main 分支。

为了让其他人看到新的 main 分支,你需要将其推送到远程。这会使重命名后的分支在远程可用。

$ git push --set-upstream origin main

现在我们得到以下状态:

$ git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

你的本地 master 分支已消失,因为它被 main 分支替换了。main 分支存在于远程仓库中。但是,旧的 master 分支仍然存在于远程上。其他协作者将继续使用 master 分支作为他们工作的基准,直到你进行进一步的更改。

现在你还有一些后续任务要完成,以完成过渡:

  • 任何依赖此项目的项目都需要更新其代码和/或配置。

  • 更新任何测试运行器配置文件。

  • 调整构建和发布脚本。

  • 重定向仓库托管平台上的设置,例如仓库的默认分支、合并规则以及其他匹配分支名称的配置。

  • 更新文档中对旧分支的引用。

  • 关闭或合并任何指向旧分支的拉取请求(Pull Request)。

完成所有这些任务,并且确定 main 分支的表现与 master 分支一致后,你可以删除 master 分支:

$ git push origin --delete master