如何变基堆叠的 Git 分支

2022年 10月 17日 34.3k 0

如何变基堆叠的 Git 分支

在处理一项功能时,您可能会将其拆分为几个堆叠的分支,以便您可以单独合并每个分支。但是更新这样的分支可能很烦人,因为你必须管理每个分支。Git 2.38 (2022-10-15) 使此类更新更容易,它能够一次重新设置一组分支,使用新的--update-refs. 让我们看几个例子。

变基堆叠的分支
想象一下你有这种情况,最近的提交首先:

* e67fe90 Add deployment (main)
|
| * 73145a7 Add Poll views (HEAD -> poll_views)
| |
| * 3345a24 Add Poll database models (poll_models)
|/
|
* 86e3722 Set up Django

86e3722 设置 Django

该main分支上有两个提交。在侧面,有两个堆叠的分支用于新的“民意调查”功能,poll_views以及poll_models.

想象一下,您想poll_*在最新的main. 没有--update-refs,您需要先 rebase poll_models,然后poll_views在新的poll_models. 但是使用该标志,您可以在一个命令中执行此操作。

首先,切换到最终的特性分支:

$ git switch poll_views

其次,使用以下命令重新定位到main分支--update-refs:

$ git rebase --update-refs main
Successfully rebased and updated refs/heads/poll_views.
Updated the following refs with --update-refs:
  refs/heads/poll_models

Git 讲述了poll_views被重新定位,并poll_models在此过程中更新。

现在两个分支都位于最新提交之上main:

* c6ac1a3 Add Poll views (HEAD -> poll_views)
|
* 9f9622b Add Poll database models (poll_models)
|
* e67fe90 Add deployment (main)
|
* 86e3722 Set up Django

如何向堆叠的分支添加更改

想象一下,你有同样的初始情况:

* bc63397 Add deployment (HEAD -> main)
|
| * 94d92fd Add Poll views (poll_views)
| |
| * 229c030 Add Poll database models (poll_models)
|/
|
* 86e3722 Set up Django

提交poll_models并poll_views进行代码审查后,您需要对两者进行一些更改。您如何进行这些更改,并确保它们最终出现在正确的分支中?

首先,查看最后一个堆叠的分支:

$ git switch poll_views

其次,进行适用于两个分支的更改:

...
$ git commit -m "Add database constraint to Poll model"
...
$ git commit -m "Add rate-limiting to view"
...

第三,启动堆栈的交互式变基:

$ git rebase -i --update-refs main

-i是 的缩写--interactive,它启用了 rebase 的交互模式。这将打开您的文本编辑器,其中包含可用于控制变基操作的文件。

第四,更改 rebase 文件以将提交移动到适当的分支。当文件打开时,您会看到它的开头如下:

pick 229c030 Add Poll database models
update-ref refs/heads/poll_models

pick 94d92fd Add Poll views
pick 31d5fc9 Add database constraint to Poll model
pick af05cde Add rate-limiting to view

# Rebase bc63397..af05cde onto bc63397 (5 commands)
#
# Commands:
...

行pick列表提交,按照它们将被重新设置的顺序。该update-ref行控制poll_models分支将在变基后指向的提交。这些也在 Git 的命令注释中进行了解释:

# p, pick <commit> = use commit
...
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
#                       to this position in the new commits. The <ref> is
#                       updated at the end of the rebase
...

在这种情况下,“将数据库约束添加到轮询模型”提交应该是poll_models. 将其线移到线上方update-ref:

pick 229c030 Add Poll database models
pick 31d5fc9 Add database constraint to Poll model
update-ref refs/heads/poll_models

pick 94d92fd Add Poll views
pick af05cde Add rate-limiting to view

# Rebase bc63397..af05cde onto bc63397 (5 commands)
...

四、保存并关闭文件,Git 将执行指示的 rebase:

$ git rebase -i --update-refs main
Successfully rebased and updated refs/heads/poll_views.
Updated the following refs with --update-refs:
  refs/heads/poll_models

现在两个分支都在 latest 之上main,它们各自的提交:

* 9182779 Add rate-limiting to view (HEAD -> poll_views)
|
* df9ae26 Add Poll views
|
* d0cfd78 Add database constraint to Poll model (poll_models)
|
* e7ee0b7 Add Poll database models
|
* bc63397 Add deployment (main)
|
* 86e3722 Set up Django

现在您可以发送每个分支进行另一轮代码审查,可能带有git push.

Enable --update-refs by default

--update-refs您可以通过默认启用更轻松地使用堆叠分支。然后,每次你 rebase 一个分支时,堆栈中任何较早的分支也将得到更新。

要默认启用该标志,对于所有 repos,将rebase.updateRefs布尔选项添加到全局配置中:

$ git config --global --add --bool rebase.updateRefs true

这将在您的~/.gitconfig文件中添加选项,如下所示:

[rebase]
    updateRefs = true

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论