ship-it

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

After-Goal: 代码提交、PR 合入、Issue 关闭工作流(GitHub)

目标完成后:代码提交、PR合入、Issue关闭工作流(GitHub)

完成 GitHub Issue 实现后的标准收尾流程:提交代码 → 推送分支 → 创建 PR → 合入 → 关闭 Issue。
完成GitHub Issue实现后的标准收尾流程:提交代码 → 推送分支 → 创建PR → 合入 → 关闭Issue。

前置条件

前置条件

  • 当前 git 仓库有已实现的代码变更
  • 已知 Issue 编号(如
    #42
  • gh CLI 已登录(
    gh auth status
    可验证)
  • 当前git仓库有已实现的代码变更
  • 已知Issue编号(如
    #42
  • gh CLI已登录(
    gh auth status
    可验证)

工作流

工作流

Step 1: 提交代码

Step 1: 提交代码

bash
undefined
bash
undefined

1a. 检查变更状态

1a. 检查变更状态

git status git diff --stat HEAD
git status git diff --stat HEAD

1b. 暂存本次 Issue 相关的文件(不要 add 不相关的文件)

1b. 暂存本次Issue相关的文件(不要add不相关的文件)

git add <files related to this issue>
git add <files related to this issue>

1c. 提交,commit message 关联 Issue

1c. 提交,commit message关联Issue

git commit -m "$(cat <<'EOF' {简要描述} (#issue-number)
{可选的详细说明} EOF )"

**关键规则:**
- commit message 中包含 `#issue-number` 以关联 Issue
- 只暂存当前 Issue 相关的文件,不要混入其他变更
git commit -m "$(cat <<'EOF' {简要描述} (#issue-number)
{可选的详细说明} EOF )"

**关键规则:**
- commit message中包含`#issue-number`以关联Issue
- 只暂存当前Issue相关的文件,不要混入其他变更

Step 2: 推送分支

Step 2: 推送分支

bash
undefined
bash
undefined

如果还在 main/master 上,先创建功能分支

如果还在main/master上,先创建功能分支

git checkout -b {branch-name} # 如已在功能分支则跳过
git checkout -b {branch-name} # 如已在功能分支则跳过

推送到远程

推送到远程

git push -u origin {branch-name}

分支命名建议:`feat/issue-42-short-desc` 或 `fix/issue-42-short-desc`
git push -u origin {branch-name}

分支命名建议:`feat/issue-42-short-desc`或`fix/issue-42-short-desc`

Step 3: 创建 PR

Step 3: 创建PR

bash
gh pr create \
  --title "{简要描述}" \
  --body "$(cat <<'EOF'
bash
gh pr create \
  --title "{简要描述}" \
  --body "$(cat <<'EOF'

Summary

Summary

  • 实现内容概述
Closes #{issue-number}
  • 实现内容概述
Closes #{issue-number}

Test plan

Test plan

  • 测试项 1
  • 测试项 2 EOF )"

**关键规则:**
- PR body 中写 `Closes #N` 或 `Fixes #N`,合入后 GitHub 自动关闭 Issue
- title 简洁,不超过 70 字符
  • 测试项1
  • 测试项2 EOF )"

**关键规则:**
- PR body中写`Closes #N`或`Fixes #N`,合入后GitHub自动关闭Issue
- title简洁,不超过70字符

Step 4: 合入 PR

Step 4: 合入PR

bash
undefined
bash
undefined

4a. 查看 PR 状态(确认 checks 通过)

4a. 查看PR状态(确认checks通过)

gh pr checks
gh pr checks

4b. 合入(默认 merge commit,可选 --squash 或 --rebase)

4b. 合入(默认merge commit,可选--squash或--rebase)

gh pr merge --squash --delete-branch

**参数说明:**
- `--squash`: 压缩为单个 commit 合入(推荐)
- `--rebase`: rebase 合入
- `--merge`: 普通 merge commit
- `--delete-branch`: 合入后删除远程分支
gh pr merge --squash --delete-branch

**参数说明:**
- `--squash`: 压缩为单个commit合入(推荐)
- `--rebase`: rebase合入
- `--merge`: 普通merge commit
- `--delete-branch`: 合入后删除远程分支

Step 5: 关闭 Issue(如未自动关闭)

Step 5: 关闭Issue(如未自动关闭)

如果 PR body 中已写
Closes #N
,合入后 Issue 会自动关闭。否则手动关闭:
bash
undefined
如果PR body中已写
Closes #N
,合入后Issue会自动关闭。否则手动关闭:
bash
undefined

5a. 添加完成评论

5a. 添加完成评论

gh issue comment {issue-number} --body "$(cat <<'EOF'
gh issue comment {issue-number} --body "$(cat <<'EOF'

实现总结

实现总结

  • 核心变更:说明
  • PR: #{pr-number} EOF )"
  • 核心变更:说明
  • PR: #{pr-number} EOF )"

5b. 关闭 Issue

5b. 关闭Issue

gh issue close {issue-number} --reason completed
undefined
gh issue close {issue-number} --reason completed
undefined

错误处理

错误处理

场景处理方式
gh pr checks
有失败项
查看失败原因,修复后追加 commit 推送
PR 有 merge conflict
git fetch origin main && git rebase origin/main
,解决冲突后 force push
gh pr merge
被 branch protection 阻止
确认 required reviews 已满足,或请 reviewer approve
Issue 合入后未自动关闭确认 PR body 包含
Closes #N
,或手动
gh issue close
场景处理方式
gh pr checks
有失败项
查看失败原因,修复后追加commit推送
PR有merge conflict
git fetch origin main && git rebase origin/main
,解决冲突后force push
gh pr merge
被branch protection阻止
确认required reviews已满足,或请reviewer approve
Issue合入后未自动关闭确认PR body包含
Closes #N
,或手动
gh issue close

完整示例

完整示例

bash
undefined
bash
undefined

创建分支并提交

创建分支并提交

git checkout -b feat/issue-42-case-model git add cases/case.go cases/case_test.go git commit -m "$(cat <<'EOF' Add Case data model and Markdown read/write (#42)
Define Case struct with YAML frontmatter + Markdown body serialization. Provide WriteCase/ReadCase/ListCases/UpdateCase. EOF )"
git checkout -b feat/issue-42-case-model git add cases/case.go cases/case_test.go git commit -m "$(cat <<'EOF' Add Case data model and Markdown read/write (#42)
Define Case struct with YAML frontmatter + Markdown body serialization. Provide WriteCase/ReadCase/ListCases/UpdateCase. EOF )"

推送

推送

git push -u origin feat/issue-42-case-model
git push -u origin feat/issue-42-case-model

创建 PR

创建PR

gh pr create
--title "Add Case data model and Markdown read/write"
--body "$(cat <<'EOF'
gh pr create
--title "Add Case data model and Markdown read/write"
--body "$(cat <<'EOF'

Summary

Summary

  • Define Case struct with YAML frontmatter + Markdown body
  • Implement WriteCase/ReadCase/ListCases/UpdateCase functions
  • Add comprehensive test coverage
Closes #42
  • Define Case struct with YAML frontmatter + Markdown body
  • Implement WriteCase/ReadCase/ListCases/UpdateCase functions
  • Add comprehensive test coverage
Closes #42

Test plan

Test plan

  • Unit tests pass
  • go vet / lint clean EOF )"
  • Unit tests pass
  • go vet / lint clean EOF )"

确认 checks 通过后合入

确认checks通过后合入

gh pr checks gh pr merge --squash --delete-branch
gh pr checks gh pr merge --squash --delete-branch

切回主分支

切回主分支

git checkout main git pull
undefined
git checkout main git pull
undefined