{"id":317,"date":"2026-10-13T13:30:58","date_gmt":"2026-10-13T13:30:58","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2012\/05\/04\/how-perforce-changelist-number-works\/"},"modified":"2026-10-13T13:30:58","modified_gmt":"2026-10-13T13:30:58","slug":"how-perforce-changelist-number-works","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-perforce-changelist-number-works\/","title":{"rendered":"Perforce Changelist Numbers Explained: Default, Numbered, and Submit-Time Renumbering"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Perforce (Helix Core) changelist numbers can be confusing when a pending changelist has one number, but appears with a different number after submission. This guide explains how numbering works, why renumbering happens, and how to use changelists safely in day-to-day development workflows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2012-05-04; fully revised and updated.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2012\/05\/perforce-changelist-number.png\" alt=\"Perforce changelist numbering\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How Perforce changelist numbering works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Perforce assigns numbers to changelists and also maintains a <strong>default changelist<\/strong>. You can create multiple changelists to organize related work, such as one for a feature and another for a bug fix. Submitted changelist numbers are maintained in ascending chronological order.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Changelists help group related file edits.<\/li><li>The default changelist exists even if you do not create a numbered one.<\/li><li>Submitted changelist numbers are serial and increase over time.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Default vs numbered vs submitted changelists<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Changelist type<\/th><th>When number is assigned<\/th><th>Can number change at submit?<\/th><th>Typical use<\/th><\/tr><\/thead><tbody><tr><td>Default changelist<\/td><td>Gets a submitted number when it is submitted<\/td><td>Not applicable before submit<\/td><td>Quick edits not yet organized into a separate numbered changelist<\/td><\/tr><tr><td>Pending numbered changelist<\/td><td>Number exists while pending<\/td><td>Yes, may be renumbered on submit to preserve chronological submitted order<\/td><td>Separating feature, bug fix, or task-specific work<\/td><\/tr><tr><td>Submitted changelist<\/td><td>Assigned\/confirmed at submit time in serial order<\/td><td>No<\/td><td>Permanent historical record in depot history<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Why renumbering happens on submit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Perforce may renumber a pending numbered changelist during submit so that submitted changelist numbers remain in chronological sequence. In practice, the changelist that is submitted first gets the next submitted number.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Developer edits files] --> B{Store edits where}\n    B --> C[Default pending changelist]\n    B --> D[Numbered pending changelist]\n    C --> E[Submit]\n    D --> E\n    E --> F[Server assigns next submitted number]\n    F --> G[Submitted changelist history stays time ordered]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Command-line examples<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following examples show common command patterns for default and numbered changelists.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Check files currently open in default changelist<\/span>\np4 opened -c <span class=\"hljs-keyword\">default<\/span>\n\n<span class=\"hljs-comment\"># Submit default changelist<\/span>\np4 submit -d <span class=\"hljs-string\">\"Submit work from default changelist\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Create or edit a numbered changelist spec<\/span>\np4 change\n\n<span class=\"hljs-comment\"># Move an opened file into a numbered changelist (example: 326042)<\/span>\np4 reopen -c <span class=\"hljs-number\">326042<\/span> src\/parser.c\n\n<span class=\"hljs-comment\"># Submit that numbered changelist<\/span>\np4 submit -c <span class=\"hljs-number\">326042<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Example renumbering scenario<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A common case is:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Latest submitted changelist is <strong>326041<\/strong>.<\/li><li>You already have pending work in numbered changelist <strong>326042<\/strong>.<\/li><li>You also have files in the default changelist and submit them first.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To keep submitted history strictly ordered by submit time, the first submit takes the next submitted number. The previously pending numbered changelist may then be submitted with a higher number than it had while pending.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/www.perforce.com\/perforce\/doc.current\/manuals\/p4guide\/04_files.html\" target=\"_blank\" rel=\"noopener\">Perforce p4guide: Files and changelists<\/a><\/li><li><a href=\"http:\/\/kb.perforce.com\/article\/781\/changelist-renumbered-on-submit\" target=\"_blank\" rel=\"noopener\">Perforce KB: Changelist renumbered on submit<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use separate numbered changelists for unrelated work to keep reviews and rollbacks clean.<\/li><li>Do not depend on a pending changelist number as a final identifier until submit completes.<\/li><li>Automations should key off submitted changelist numbers, not pending numbers.<\/li><li>Keep changelist descriptions clear so renumbering does not affect traceability.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Perforce changelist numbers are simple once you understand when numbers are assigned and why pending changelists can be renumbered at submit time. This guide clarifies the default changelist, numbered changelists, and practical p4 command usage.<\/p>\n","protected":false},"author":1,"featured_media":3831,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[370],"tags":[1960,2536,545,2538,2532,373,2534,2535,1956,2537,2539,1884,2533],"class_list":["post-317","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perforce","tag-changelist","tag-changelist-number","tag-how","tag-how-changelist-number-works","tag-number","tag-perforce","tag-perforce-changelist","tag-perforce-changelist-number","tag-perforce-guide","tag-perforce-integration","tag-perforce-learning-resources","tag-perforce-tutorial","tag-works"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=317"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/317\/revisions"}],"predecessor-version":[{"id":79185,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/317\/revisions\/79185"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3831"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}