devtools-version-control
GitHubChrome DevTools专属版本控制指南,强制使用git new-branch而非标准Git命令以适配Gerrit工作流。涵盖创建分支、单提交修改、堆叠CL依赖管理、重基线及同步上游等核心操作规范。
Trigger Scenarios
Install
npx skills add ChromeDevTools/devtools-frontend --skill devtools-version-control -g -y
SKILL.md
Frontmatter
{
"name": "devtools-version-control",
"description": "Use when starting a new task, creating a branch, switching branches, managing branches, creating and uploading CLs, handling stacked changes, or checking release and roll status in the DevTools Gerrit-based workflow. ALWAYS use this instead of running standard git checkout\/switch commands for branch creation."
}
DevTools Version Control
[!IMPORTANT] DO NOT use standard Git commands like
git checkout -borgit switch -cto create branches. In Chrome DevTools, you MUST always usegit new-branch <branch-name>(orgit new-branch --upstream_current <branch-name>for stacked CLs). Standard commands fail to configure the correct upstream tracking branch required bydepot_toolsand Gerrit.
Overview
Chrome DevTools uses Gerrit for code review. The standard workflow is one branch per Change List (CL) and one commit per branch. Instead of multiple commits, you amend your single commit locally.
Core Workflow
Creating a New CL
To start a new task, create a new branch from main:
git new-branch <branch-name>
Note: This automatically sets the upstream to origin/main.
Making Changes
- Make your changes.
- Stage them:
git add <files>. - Create the commit:
git commit -m "Your message".
Updating a CL (Amending)
To update your CL after feedback or more work:
- Make more changes.
- Stage them:
git add <files>. - Amend the commit:
git commit --amend.
Stacked CLs
If CL B depends on CL A:
- While on branch A, create branch B:
git new-branch --upstream_current <branch-B> - Develop on branch B.
- When uploading B, Gerrit will show the dependency on A.
Reparenting & Detaching Landed CLs
If you need to change the base of a branch back to the root branch (e.g., move CL B to be based on origin/main instead of CL A):
git reparent-branch --root
Or to make it depend on another branch C:
git reparent-branch <branch-C>
- Detaching from landed CLs: When parent CLs in a stack have landed on
main, first rungit fetchsoorigin/mainincludes the landed commits (otherwise reparenting will trigger merge conflicts). Then check out the first unlanded branch in the chain and rungit reparent-branch --rootbefore archiving the landed branches (sodepot_toolscan still resolve the old upstream tracking branch). After reparenting (which automatically runsgit rebase-update), archive the landed branches (git cl archive -f) and rungclient sync -Df.
Syncing with Upstream
To update all your branches with the latest changes from main and their respective upstreams, and synchronize dependencies:
git rebase-update && gclient sync -Df
- Always use
git rebase-updatefor stacks: Never write manualgit checkout && git rebaseloops across stacked branches.git rebase-updateautomatically rebases the entire dependency graph in order. - Clean up old branches first: Before running
git rebase-update, archive landed/closed branches (git cl archive -f) or mark dormant (git config branch.<branch>.dormant true) any obsolete branches so they do not trigger unnecessary rebase conflicts. - Always sync dependencies after rebase: Always run
gclient sync -Dfafter agit rebase-update. CIPD dependency updates do not show up ingit status, so skippinggclient sync -Dfrisks leaving your checkout out of sync.
Initial upload
When a CL is ready, upload it with:
git cl upload -f -d --commit-description="<description>"
- Always include
-f(--force) so thatgit cl uploadruns non-interactively without opening a text editor or prompting. - Use the same writing style as the current committer
- Keep line length below 72
- Add a "Bug:
" or "Bug: None" trailer on a separate line. - Amend formatter/linter changes and fix linter issues.
- For a brand new stack of CLs, perform the initial upload on each branch individually in parent-to-child order so each CL receives its own commit description.
Subsequent upload & Updating Stacks
To upload an updated CL:
git cl upload -f -d -t "<one sentence patch set description>"
- Updating an existing stack of CLs: Once all CLs in a stack have been initially created, only run
git cl uploadfrom the leaf (latest) branch in the chain for subsequent updates. Uploading from the leaf branch automatically runs presubmit checks and uploads new patchsets for all parent CLs in the stack simultaneously. Never upload intermediate CLs one by one when updating a stack.
Release and Roll Status
To check whether a DevTools commit (devtools/devtools-frontend) has rolled into chromium/src (Roll status) and what version or channel it is deployed to (Release status), look it up via the Chromium Dash API:
https://chromiumdash.appspot.com/fetch_commit?commit=<sha>
Quick Reference
| Action | Command |
|---|---|
| Create new CL from main | git new-branch <name> |
| Create stacked CL | git new-branch --upstream_current <name> |
| Update current CL | git commit --amend |
| Initial CL upload | git cl upload -f -d --commit-description="<description>" |
| Subsequent CL upload (or update stack from leaf) | git cl upload -f -d -t "<message>" |
Reparent branch to root (origin/main) |
git reparent-branch --root |
| Change branch parent | git reparent-branch <new-parent> |
| Archive landed/closed branches | git cl archive -f |
| Rebase all branches in stack | git rebase-update |
| Sync dependencies after rebase | gclient sync -Df |
| Check release & roll status | Query https://chromiumdash.appspot.com/fetch_commit?commit=<sha> |
Common Mistakes
- Multiple commits on one branch: Gerrit expects one commit per CL. Always
commit --amend. - Using
git checkout -b: Does not set up tracking information correctly fordepot_tools. Usegit new-branch. - Manual rebasing of stacked branches: Never use manual
git rebaseloops. Always usegit rebase-updateorgit reparent-branchto letdepot_toolshandle tracking updates. - Uploading intermediate branches when updating a stack: When updating an existing stack of CLs, do not run
git cl uploadon each branch in a chain—uploading from the leaf branch uploads new patchsets for all parent CLs automatically (note: initial uploads must still be done per branch). - Archiving parent branches before reparenting: Always run
git fetchandgit reparent-branch --rooton the child branch before archiving a landed parent branch withgit cl archive -f.
Version History
-
fa08629
Current 2026-09-23 06:26
新增git cl archive命令说明,建议用其归档已合并分支;完善堆叠变更最佳实践,包括自动变基和依赖同步步骤。
- 678d19c 2026-08-20 15:21


