Skip to content

Commit 828ceb0

Browse files
committed
Add merge style fast-forward-only
With this option, it is possible to require a linear commit history with the following benefits over the next best option Rebase+fast-forward: the original commits continue existing, with the original signatures continuing to stay valid instead of being rewritten, there is no merge commit, and reverting commits becomes easier. Closes #24906
1 parent 34633d8 commit 828ceb0

File tree

23 files changed

+96
-11
lines changed

23 files changed

+96
-11
lines changed

custom/conf/app.example.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ LEVEL = Info
10441044
;; List of keywords used in Pull Request comments to automatically reopen a related issue
10451045
;REOPEN_KEYWORDS = reopen,reopens,reopened
10461046
;;
1047-
;; Set default merge style for repository creating, valid options: merge, rebase, rebase-merge, squash
1047+
;; Set default merge style for repository creating, valid options: merge, rebase, rebase-merge, squash, fast-forward-only
10481048
;DEFAULT_MERGE_STYLE = merge
10491049
;;
10501050
;; In the default merge message for squash commits include at most this many commits

docs/content/administration/config-cheat-sheet.en-us.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ In addition, there is _`StaticRootPath`_ which can be set as a built-in at build
126126
keywords used in Pull Request comments to automatically close a related issue
127127
- `REOPEN_KEYWORDS`: **reopen**, **reopens**, **reopened**: List of keywords used in Pull Request comments to automatically reopen
128128
a related issue
129-
- `DEFAULT_MERGE_STYLE`: **merge**: Set default merge style for repository creating, valid options: `merge`, `rebase`, `rebase-merge`, `squash`
129+
- `DEFAULT_MERGE_STYLE`: **merge**: Set default merge style for repository creating, valid options: `merge`, `rebase`, `rebase-merge`, `squash`, `fast-forward-only`
130130
- `DEFAULT_MERGE_MESSAGE_COMMITS_LIMIT`: **50**: In the default merge message for squash commits include at most this many commits. Set to `-1` to include all commits
131131
- `DEFAULT_MERGE_MESSAGE_SIZE`: **5120**: In the default merge message for squash commits limit the size of the commit messages. Set to `-1` to have no limit. Only used if `POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES` is `true`.
132132
- `DEFAULT_MERGE_MESSAGE_ALL_AUTHORS`: **false**: In the default merge message for squash commits walk all commits to include all authors in the Co-authored-by otherwise just use those in the limited list

docs/content/administration/config-cheat-sheet.zh-cn.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ menu:
125125
- `CLOSE_KEYWORDS`: **close**, **closes**, **closed**, **fix**, **fixes**, **fixed**, **resolve**, **resolves**, **resolved**: 在拉取请求评论中用于自动关闭相关问题的关键词列表。
126126
- `REOPEN_KEYWORDS`: **reopen**, **reopens**, **reopened**: 在拉取请求评论中用于自动重新打开相关问题的
127127
关键词列表。
128-
- `DEFAULT_MERGE_STYLE`: **merge**: 设置创建仓库的默认合并方式,可选: `merge`, `rebase`, `rebase-merge`, `squash`
128+
- `DEFAULT_MERGE_STYLE`: **merge**: 设置创建仓库的默认合并方式,可选: `merge`, `rebase`, `rebase-merge`, `squash`, `fast-forward-only`
129129
- `DEFAULT_MERGE_MESSAGE_COMMITS_LIMIT`: **50**: 在默认合并消息中,对于`squash`提交,最多包括此数量的提交。设置为 -1 以包括所有提交。
130130
- `DEFAULT_MERGE_MESSAGE_SIZE`: **5120**: 在默认的合并消息中,对于`squash`提交,限制提交消息的大小。设置为 `-1`以取消限制。仅在`POPULATE_SQUASH_COMMENT_WITH_COMMIT_MESSAGES``true`时使用。
131131
- `DEFAULT_MERGE_MESSAGE_ALL_AUTHORS`: **false**: 在默认合并消息中,对于`squash`提交,遍历所有提交以包括所有作者的`Co-authored-by`,否则仅使用限定列表中的作者。

models/repo/git.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const (
2121
MergeStyleRebaseMerge MergeStyle = "rebase-merge"
2222
// MergeStyleSquash squash commits into single commit before merging
2323
MergeStyleSquash MergeStyle = "squash"
24+
// MergeStyleFastForwardOnly fast-forward merge if possible, otherwise fail
25+
MergeStyleFastForwardOnly MergeStyle = "fast-forward-only"
2426
// MergeStyleManuallyMerged pr has been merged manually, just mark it as merged directly
2527
MergeStyleManuallyMerged MergeStyle = "manually-merged"
2628
// MergeStyleRebaseUpdate not a merge style, used to update pull head by rebase

models/repo/repo_unit.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ type PullRequestsConfig struct {
122122
AllowRebase bool
123123
AllowRebaseMerge bool
124124
AllowSquash bool
125+
AllowFastForwardOnly bool
125126
AllowManualMerge bool
126127
AutodetectManualMerge bool
127128
AllowRebaseUpdate bool
@@ -148,6 +149,7 @@ func (cfg *PullRequestsConfig) IsMergeStyleAllowed(mergeStyle MergeStyle) bool {
148149
mergeStyle == MergeStyleRebase && cfg.AllowRebase ||
149150
mergeStyle == MergeStyleRebaseMerge && cfg.AllowRebaseMerge ||
150151
mergeStyle == MergeStyleSquash && cfg.AllowSquash ||
152+
mergeStyle == MergeStyleFastForwardOnly && cfg.AllowFastForwardOnly ||
151153
mergeStyle == MergeStyleManuallyMerged && cfg.AllowManualMerge
152154
}
153155

modules/git/error.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (err ErrBranchNotExist) Unwrap() error {
9696
return util.ErrNotExist
9797
}
9898

99-
// ErrPushOutOfDate represents an error if merging fails due to unrelated histories
99+
// ErrPushOutOfDate represents an error if merging fails due to the base branch being updated
100100
type ErrPushOutOfDate struct {
101101
StdOut string
102102
StdErr string

modules/repository/create.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ func CreateRepositoryByExample(ctx context.Context, doer, u *user_model.User, re
8787
units = append(units, repo_model.RepoUnit{
8888
RepoID: repo.ID,
8989
Type: tp,
90-
Config: &repo_model.PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle), AllowRebaseUpdate: true},
90+
Config: &repo_model.PullRequestsConfig{
91+
AllowMerge: true, AllowRebase: true, AllowRebaseMerge: true, AllowSquash: true, AllowFastForwardOnly: true,
92+
DefaultMergeStyle: repo_model.MergeStyle(setting.Repository.PullRequest.DefaultMergeStyle),
93+
AllowRebaseUpdate: true,
94+
},
9195
})
9296
} else {
9397
units = append(units, repo_model.RepoUnit{

modules/structs/repo.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ type Repository struct {
9898
AllowRebase bool `json:"allow_rebase"`
9999
AllowRebaseMerge bool `json:"allow_rebase_explicit"`
100100
AllowSquash bool `json:"allow_squash_merge"`
101+
AllowFastForwardOnly bool `json:"allow_fast_forward_only_merge"`
101102
AllowRebaseUpdate bool `json:"allow_rebase_update"`
102103
DefaultDeleteBranchAfterMerge bool `json:"default_delete_branch_after_merge"`
103104
DefaultMergeStyle string `json:"default_merge_style"`
@@ -195,6 +196,8 @@ type EditRepoOption struct {
195196
AllowRebaseMerge *bool `json:"allow_rebase_explicit,omitempty"`
196197
// either `true` to allow squash-merging pull requests, or `false` to prevent squash-merging.
197198
AllowSquash *bool `json:"allow_squash_merge,omitempty"`
199+
// either `true` to allow fast-forward-only merging pull requests, or `false` to prevent fast-forward-only merging.
200+
AllowFastForwardOnly *bool `json:"allow_fast_forward_only_merge,omitempty"`
198201
// either `true` to allow mark pr as merged manually, or `false` to prevent it.
199202
AllowManualMerge *bool `json:"allow_manual_merge,omitempty"`
200203
// either `true` to enable AutodetectManualMerge, or `false` to prevent it. Note: In some special cases, misjudgments can occur.
@@ -203,7 +206,7 @@ type EditRepoOption struct {
203206
AllowRebaseUpdate *bool `json:"allow_rebase_update,omitempty"`
204207
// set to `true` to delete pr branch after merge by default
205208
DefaultDeleteBranchAfterMerge *bool `json:"default_delete_branch_after_merge,omitempty"`
206-
// set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", or "squash".
209+
// set to a merge style to be used by this repository: "merge", "rebase", "rebase-merge", "squash", or "fast-forward-only".
207210
DefaultMergeStyle *string `json:"default_merge_style,omitempty"`
208211
// set to `true` to allow edits from maintainers by default
209212
DefaultAllowMaintainerEdit *bool `json:"default_allow_maintainer_edit,omitempty"`

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1775,6 +1775,7 @@ pulls.merge_pull_request = Create merge commit
17751775
pulls.rebase_merge_pull_request = Rebase then fast-forward
17761776
pulls.rebase_merge_commit_pull_request = Rebase then create merge commit
17771777
pulls.squash_merge_pull_request = Create squash commit
1778+
pulls.fast_forward_only_merge_pull_request = Fast-forward
17781779
pulls.merge_manually = Manually merged
17791780
pulls.merge_commit_id = The merge commit ID
17801781
pulls.require_signed_wont_sign = The branch requires signed commits but this merge will not be signed

routers/api/v1/repo/repo.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,7 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
884884
AllowRebase: true,
885885
AllowRebaseMerge: true,
886886
AllowSquash: true,
887+
AllowFastForwardOnly: true,
887888
AllowManualMerge: true,
888889
AutodetectManualMerge: false,
889890
AllowRebaseUpdate: true,
@@ -910,6 +911,9 @@ func updateRepoUnits(ctx *context.APIContext, opts api.EditRepoOption) error {
910911
if opts.AllowSquash != nil {
911912
config.AllowSquash = *opts.AllowSquash
912913
}
914+
if opts.AllowFastForwardOnly != nil {
915+
config.AllowFastForwardOnly = *opts.AllowFastForwardOnly
916+
}
913917
if opts.AllowManualMerge != nil {
914918
config.AllowManualMerge = *opts.AllowManualMerge
915919
}

routers/api/v1/repo/repo_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func TestRepoEdit(t *testing.T) {
3535
allowRebase := false
3636
allowRebaseMerge := false
3737
allowSquashMerge := false
38+
allowFastForwardOnlyMerge := false
3839
archived := true
3940
opts := api.EditRepoOption{
4041
Name: &ctx.Repo.Repository.Name,
@@ -50,6 +51,7 @@ func TestRepoEdit(t *testing.T) {
5051
AllowRebase: &allowRebase,
5152
AllowRebaseMerge: &allowRebaseMerge,
5253
AllowSquash: &allowSquashMerge,
54+
AllowFastForwardOnly: &allowFastForwardOnlyMerge,
5355
Archived: &archived,
5456
}
5557

routers/web/repo/issue.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,6 +1862,8 @@ func ViewIssue(ctx *context.Context) {
18621862
mergeStyle = repo_model.MergeStyleRebaseMerge
18631863
} else if prConfig.AllowSquash {
18641864
mergeStyle = repo_model.MergeStyleSquash
1865+
} else if prConfig.AllowFastForwardOnly {
1866+
mergeStyle = repo_model.MergeStyleFastForwardOnly
18651867
} else if prConfig.AllowManualMerge {
18661868
mergeStyle = repo_model.MergeStyleManuallyMerged
18671869
}

routers/web/repo/setting/setting.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ func SettingsPost(ctx *context.Context) {
576576
AllowRebase: form.PullsAllowRebase,
577577
AllowRebaseMerge: form.PullsAllowRebaseMerge,
578578
AllowSquash: form.PullsAllowSquash,
579+
AllowFastForwardOnly: form.PullsAllowFastForwardOnly,
579580
AllowManualMerge: form.PullsAllowManualMerge,
580581
AutodetectManualMerge: form.EnableAutodetectManualMerge,
581582
AllowRebaseUpdate: form.PullsAllowRebaseUpdate,

services/convert/repository.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR
9393
allowRebase := false
9494
allowRebaseMerge := false
9595
allowSquash := false
96+
allowFastForwardOnly := false
9697
allowRebaseUpdate := false
9798
defaultDeleteBranchAfterMerge := false
9899
defaultMergeStyle := repo_model.MergeStyleMerge
@@ -105,6 +106,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR
105106
allowRebase = config.AllowRebase
106107
allowRebaseMerge = config.AllowRebaseMerge
107108
allowSquash = config.AllowSquash
109+
allowFastForwardOnly = config.AllowFastForwardOnly
108110
allowRebaseUpdate = config.AllowRebaseUpdate
109111
defaultDeleteBranchAfterMerge = config.DefaultDeleteBranchAfterMerge
110112
defaultMergeStyle = config.GetDefaultMergeStyle()
@@ -219,6 +221,7 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, permissionInR
219221
AllowRebase: allowRebase,
220222
AllowRebaseMerge: allowRebaseMerge,
221223
AllowSquash: allowSquash,
224+
AllowFastForwardOnly: allowFastForwardOnly,
222225
AllowRebaseUpdate: allowRebaseUpdate,
223226
DefaultDeleteBranchAfterMerge: defaultDeleteBranchAfterMerge,
224227
DefaultMergeStyle: string(defaultMergeStyle),

services/forms/repo_form.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ type RepoSettingForm struct {
151151
PullsAllowRebase bool
152152
PullsAllowRebaseMerge bool
153153
PullsAllowSquash bool
154+
PullsAllowFastForwardOnly bool
154155
PullsAllowManualMerge bool
155156
PullsDefaultMergeStyle string
156157
EnableAutodetectManualMerge bool
@@ -598,8 +599,8 @@ func (f *InitializeLabelsForm) Validate(req *http.Request, errs binding.Errors)
598599
// swagger:model MergePullRequestOption
599600
type MergePullRequestForm struct {
600601
// required: true
601-
// enum: merge,rebase,rebase-merge,squash,manually-merged
602-
Do string `binding:"Required;In(merge,rebase,rebase-merge,squash,manually-merged)"`
602+
// enum: merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged
603+
Do string `binding:"Required;In(merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged)"`
603604
MergeTitleField string
604605
MergeMessageField string
605606
MergeCommitID string // only used for manually-merged

services/pull/merge.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ func doMergeAndPush(ctx context.Context, pr *issues_model.PullRequest, doer *use
267267
if err := doMergeStyleSquash(mergeCtx, message); err != nil {
268268
return "", err
269269
}
270+
case repo_model.MergeStyleFastForwardOnly:
271+
if err := doMergeStyleFastForwardOnly(mergeCtx); err != nil {
272+
return "", err
273+
}
270274
default:
271275
return "", models.ErrInvalidMergeStyle{ID: pr.BaseRepo.ID, Style: mergeStyle}
272276
}

services/pull/merge_ff_only.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2023 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package pull
5+
6+
import (
7+
repo_model "code.gitea.io/gitea/models/repo"
8+
"code.gitea.io/gitea/modules/git"
9+
"code.gitea.io/gitea/modules/log"
10+
)
11+
12+
// doMergeStyleFastForwardOnly merges the tracking into the current HEAD - which is assumed to be staging branch (equal to the pr.BaseBranch)
13+
func doMergeStyleFastForwardOnly(ctx *mergeContext) error {
14+
cmd := git.NewCommand(ctx, "merge", "--ff-only").AddDynamicArguments(trackingBranch)
15+
if err := runMergeCommand(ctx, repo_model.MergeStyleFastForwardOnly, cmd); err != nil {
16+
log.Error("%-v Unable to merge tracking into base: %v", ctx.pr, err)
17+
return err
18+
}
19+
20+
return nil
21+
}

services/pull/merge_merge.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"code.gitea.io/gitea/modules/log"
1010
)
1111

12-
// doMergeStyleMerge merges the tracking into the current HEAD - which is assumed to tbe staging branch (equal to the pr.BaseBranch)
12+
// doMergeStyleMerge merges the tracking branch into the current HEAD - which is assumed to be the staging branch (equal to the pr.BaseBranch)
1313
func doMergeStyleMerge(ctx *mergeContext, message string) error {
1414
cmd := git.NewCommand(ctx, "merge", "--no-ff", "--no-commit").AddDynamicArguments(trackingBranch)
1515
if err := runMergeCommand(ctx, repo_model.MergeStyleMerge, cmd); err != nil {

templates/repo/issue/view_content/pull.tmpl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@
197197
{{if .AllowMerge}} {{/* user is allowed to merge */}}
198198
{{$prUnit := .Repository.MustGetUnit $.Context $.UnitTypePullRequests}}
199199
{{$approvers := (.Issue.PullRequest.GetApprovers ctx)}}
200-
{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash}}
200+
{{if or $prUnit.PullRequestsConfig.AllowMerge $prUnit.PullRequestsConfig.AllowRebase $prUnit.PullRequestsConfig.AllowRebaseMerge $prUnit.PullRequestsConfig.AllowSquash $prUnit.PullRequestsConfig.AllowFastForwardOnly}}
201201
{{$hasPendingPullRequestMergeTip := ""}}
202202
{{if .HasPendingPullRequestMerge}}
203203
{{$createdPRMergeStr := TimeSinceUnix .PendingPullRequestMerge.CreatedUnix ctx.Locale}}
@@ -268,6 +268,13 @@
268268
'mergeMessageFieldText': {{.GetCommitMessages}} + defaultSquashMergeMessage,
269269
'hideAutoMerge': generalHideAutoMerge,
270270
},
271+
{
272+
'name': 'fast-forward-only',
273+
'allowed': {{and $prUnit.PullRequestsConfig.AllowFastForwardOnly (eq .Issue.PullRequest.CommitsBehind 0)}},
274+
'textDoMerge': {{ctx.locale.Tr "repo.pulls.fast_forward_only_merge_pull_request"}},
275+
'hideMergeMessageTexts': true,
276+
'hideAutoMerge': generalHideAutoMerge,
277+
},
271278
{
272279
'name': 'manually-merged',
273280
'allowed': {{$prUnit.PullRequestsConfig.AllowManualMerge}},

templates/repo/issue/view_content/pull_merge_instruction.tmpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
<div>git checkout {{.PullRequest.BaseBranch}}</div>
3636
<div>git merge --squash {{$localBranch}}</div>
3737
</div>
38+
<div class="gt-hidden" data-pull-merge-style="fast-forward-only">
39+
<div>git checkout {{.PullRequest.BaseBranch}}</div>
40+
<div>git merge --ff-only {{$localBranch}}</div>
41+
</div>
3842
<div class="gt-hidden" data-pull-merge-style="manually-merged">
3943
<div>git checkout {{.PullRequest.BaseBranch}}</div>
4044
<div>git merge {{$localBranch}}</div>

templates/repo/settings/options.tmpl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,12 @@
517517
<label>{{ctx.Locale.Tr "repo.pulls.squash_merge_pull_request"}}</label>
518518
</div>
519519
</div>
520+
<div class="field">
521+
<div class="ui checkbox">
522+
<input name="pulls_allow_fast_forward_only" type="checkbox" {{if or (not $pullRequestEnabled) ($prUnit.PullRequestsConfig.AllowFastForwardOnly)}}checked{{end}}>
523+
<label>{{ctx.locale.Tr "repo.pulls.fast_forward_only_merge_pull_request"}}</label>
524+
</div>
525+
</div>
520526
<div class="field">
521527
<div class="ui checkbox">
522528
<input name="pulls_allow_manual_merge" type="checkbox" {{if or (not $pullRequestEnabled) ($prUnit.PullRequestsConfig.AllowManualMerge)}}checked{{end}}>
@@ -534,6 +540,7 @@
534540
<option value="rebase" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase")}}selected{{end}}>{{ctx.Locale.Tr "repo.pulls.rebase_merge_pull_request"}}</option>
535541
<option value="rebase-merge" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "rebase-merge")}}selected{{end}}>{{ctx.Locale.Tr "repo.pulls.rebase_merge_commit_pull_request"}}</option>
536542
<option value="squash" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "squash")}}selected{{end}}>{{ctx.Locale.Tr "repo.pulls.squash_merge_pull_request"}}</option>
543+
<option value="fast-forward-only" {{if or (not $pullRequestEnabled) (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "fast-forward-only")}}selected{{end}}>{{ctx.Locale.Tr "repo.pulls.fast_forward_only_merge_pull_request"}}</option>
537544
</select>{{svg "octicon-triangle-down" 14 "dropdown icon"}}
538545
<div class="default text">
539546
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "merge")}}
@@ -548,12 +555,16 @@
548555
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "squash")}}
549556
{{ctx.Locale.Tr "repo.pulls.squash_merge_pull_request"}}
550557
{{end}}
558+
{{if (eq $prUnit.PullRequestsConfig.DefaultMergeStyle "fast-forward-only")}}
559+
{{ctx.locale.Tr "repo.pulls.fast_forward_only_merge_pull_request"}}
560+
{{end}}
551561
</div>
552562
<div class="menu">
553563
<div class="item" data-value="merge">{{ctx.Locale.Tr "repo.pulls.merge_pull_request"}}</div>
554564
<div class="item" data-value="rebase">{{ctx.Locale.Tr "repo.pulls.rebase_merge_pull_request"}}</div>
555565
<div class="item" data-value="rebase-merge">{{ctx.Locale.Tr "repo.pulls.rebase_merge_commit_pull_request"}}</div>
556566
<div class="item" data-value="squash">{{ctx.Locale.Tr "repo.pulls.squash_merge_pull_request"}}</div>
567+
<div class="item" data-value="fast-forward-only">{{ctx.Locale.Tr "repo.pulls.fast_forward_only_merge_pull_request"}}</div>
557568
</div>
558569
</div>
559570
</div>

0 commit comments

Comments
 (0)