章节 ▾ 第二版

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

这将用 corrected-branch-name 替换你的 bad-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 分支作为他们工作的基准,直到你进行一些进一步的更改。

现在你还有一些任务需要完成以完成过渡。

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

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

  • 调整构建和发布脚本。

  • 在你的存储库主机上重定向设置,例如存储库的默认分支、合并规则以及其他与分支名称匹配的设置。

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

  • 关闭或合并任何以旧分支为目标的拉取请求。

完成所有这些任务,并确信 main 分支的性能与 master 分支一样,然后你就可以删除 master 分支了。

$ git push origin --delete master