在处理一项功能时,您可能会将其拆分为几个堆叠的分支,以便您可以单独合并每个分支。但是更新这样的分支可能很烦人,因为你必须管理每个分支。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