-
1. 起步
-
2. Git 基础
-
3. Git 分支
-
4. 服务器上的 Git
- 4.1 协议
- 4.2 在服务器上部署 Git
- 4.3 生成 SSH 公钥
- 4.4 架设服务器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管服务
- 4.10 小结
-
5. 分布式 Git
-
A1. 附录 A: Git 在其他环境
- A1.1 图形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小结
-
A2. 附录 B: 在应用程序中嵌入 Git
-
A3. 附录 C: Git 命令
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
强制执行,正如提示信息所指出的。
提示
|
上面描述的选项 你总是可以提供一个额外的参数来查询相对于其他分支的合并状态,而无需先检出那个其他分支,例如,什么尚未合并到
|
更改分支名称
注意
|
不要重命名仍在被其他协作者使用的分支。在没有阅读 更改 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
分支作为他们工作的基础,直到你进行进一步的更改。
现在你还有一些任务需要完成才能彻底转换:
-
任何依赖于此项目的项目都需要更新其代码和/或配置。
-
更新任何测试运行器配置文件。
-
调整构建和发布脚本。
-
重定向你的仓库主机上的设置,例如仓库的默认分支、合并规则以及其他匹配分支名称的设置。
-
更新文档中对旧分支的引用。
-
关闭或合并任何针对旧分支的拉取请求。
完成所有这些任务,并确定 main
分支的性能与 master
分支完全相同之后,你可以删除 master
分支:
$ git push origin --delete master