{"id":133,"date":"2026-10-12T11:22:23","date_gmt":"2026-10-12T11:22:23","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/06\/20\/cheat-sheet-of-perforce-command-line\/"},"modified":"2026-10-12T11:22:23","modified_gmt":"2026-10-12T11:22:23","slug":"cheat-sheet-of-perforce-command-line","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/cheat-sheet-of-perforce-command-line\/","title":{"rendered":"Perforce p4 Command-Line Cheat Sheet: Query, Sync, Integrate, and Admin Workflows"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Perforce command names can look similar when you are under delivery pressure. This updated cheat sheet helps developers, release engineers, and administrators quickly choose the right <code>p4<\/code> command for searching history, syncing files, integrating codelines, and managing labels.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-06-20; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Original reference post: <a href=\"https:\/\/www.devopsschool.com\/blog\/cheat-sheet-of-perforce-command-line\/\">Perforce Web References &amp; Cheatsheet<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/06\/perforce-command-line-cheat.png\" alt=\"perforce-command-line-cheatsheet\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Command chooser for Perforce data-mining questions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When the question is clear, the command choice is usually straightforward. Use this mapping to decide whether you need file names, changelists, detailed history, or content differences.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Question pattern<\/th><th>Start with<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>What are the filenames that match a path or revision?<\/td><td><code>p4 files<\/code> or <code>p4 have<\/code><\/td><td><code>p4 files \/\/depot\/...#head<\/code><br><code>p4 files \/\/depot\/...@label<\/code><br><code>p4 have<\/code><\/td><\/tr><tr><td>What changed in my workspace copy versus depot?<\/td><td><code>p4 diff<\/code><\/td><td><code>p4 diff file.c<\/code><br><code>p4 diff -se<\/code><\/td><\/tr><tr><td>What differs between two depot files, paths, or revisions?<\/td><td><code>p4 diff2<\/code><\/td><td><code>p4 diff2 file1.c#1 file1.c#2<\/code><br><code>p4 diff2 dir1\/...@now dir1\/...@2000\/01\/02<\/code><\/td><\/tr><tr><td>Tell me everything about changelist N.<\/td><td><code>p4 describe<\/code><\/td><td><code>p4 describe 1231<\/code><\/td><\/tr><tr><td>Show changelists for a path, file, or integration history.<\/td><td><code>p4 changes<\/code><\/td><td><code>p4 changes \/\/depot\/eng\/prodxyz\/...<\/code><br><code>p4 changes -i \/\/depot\/eng\/prodxyz\/...<\/code><\/td><\/tr><tr><td>Show all revisions and integrations of one file.<\/td><td><code>p4 filelog<\/code><\/td><td><code>p4 filelog file.java<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">p4 files <span class=\"hljs-comment\">\/\/depot\/...#have<\/span>\np4 files <span class=\"hljs-comment\">\/\/depot\/...@1541<\/span>\np4 changes file.c\np4 describe <span class=\"hljs-number\">1231<\/span>\np4 filelog file.java<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Daily workspace workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the common developer loop: configure workspace, sync, open files, review, and submit.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Create or update workspace] --> B[Sync files from depot]\n    B --> C[Open files for add edit or delete]\n    C --> D[Review local changes]\n    D --> E{Ready to publish}\n    E -- no --> F[Continue editing or revert]\n    F --> C\n    E -- yes --> G[Submit changelist]\n    G --> H[Integrate or share with team]\n<\/pre>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">p4 <span class=\"hljs-keyword\">set<\/span> P4CLIENT=my_workspace\np4 client -t 1.0dev\np4 sync \/\/depot\/eng\/...\n\np4 edit relnotes.txt\np4 diff relnotes.txt\np4 submit relnotes.txt\n\np4 revert -a\np4 revert file.java<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Revision specifiers quick reference<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Many Perforce commands become much more useful when you add a revision specifier.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Specifier<\/th><th>Typical meaning in this cheat sheet<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td><code>#head<\/code><\/td><td>Head revision of a file<\/td><td><code>p4 sync file.java#head<\/code><\/td><\/tr><tr><td><code>@now<\/code><\/td><td>Current state at the present time<\/td><td><code>p4 sync file.java@now<\/code><\/td><\/tr><tr><td><code>@YYYY\/MM\/DD<\/code><\/td><td>File state as of a date<\/td><td><code>p4 sync file.java@2000\/04\/15<\/code><\/td><\/tr><tr><td><code>@label<\/code><\/td><td>Revisions captured by a label<\/td><td><code>p4 sync file.java@xyz<\/code><\/td><\/tr><tr><td><code>@123456<\/code><\/td><td>Revisions as of a changelist<\/td><td><code>p4 sync file.java@123456<\/code><\/td><\/tr><tr><td><code>@client<\/code><\/td><td>Revision associated with a named client workspace<\/td><td><code>p4 sync file.java@jab.work<\/code><\/td><\/tr><tr><td><code>#have<\/code><\/td><td>Revision currently in your workspace<\/td><td><code>p4 sync -f file.java#have<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Branching and selective integration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use branch specifications consistently, then drive integrations with <code>p4 integ<\/code> (shorthand for <code>p4 integrate<\/code>) and inspect branch differences with <code>p4 diff2 -b<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Goal<\/th><th>Command pattern<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>Push from base codeline to release codeline<\/td><td><code>p4 integ -b branchName [file\/revision args]<\/code><\/td><td>Use changelist ranges like <code>\/\/...@129,@134<\/code> for selective pushes.<\/td><\/tr><tr><td>Push from release back to base<\/td><td><code>p4 integ -b branchName -r [file\/revision args]<\/code><\/td><td><code>-r<\/code> reverses source and target from the branch spec.<\/td><\/tr><tr><td>Compare branch spec source and target<\/td><td><code>p4 diff2 -b branchName<\/code><\/td><td>Useful before or after larger merges.<\/td><\/tr><tr><td>List available branch specs<\/td><td><code>p4 branches<\/code><\/td><td>Most useful when teams standardize branch spec naming.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Base to release<\/span>\np4 integ -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-comment\">\/\/...@=1232<\/span>\np4 integ -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span> <span class=\"hljs-comment\">\/\/...@129,@134<\/span>\np4 integ -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span>\n\n<span class=\"hljs-comment\"># Release to base (reverse mapping from branch spec)<\/span>\np4 integ -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span> -r @=<span class=\"hljs-number\">1235<\/span>\np4 integ -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span> -r <span class=\"hljs-comment\">\/\/...@127,@128<\/span>\np4 integ -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span> -r\n\n<span class=\"hljs-comment\"># Branch comparison<\/span>\np4 diff2 -b prodxyz<span class=\"hljs-number\">-1.0<\/span><span class=\"hljs-number\">.1<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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\">Labels and release snapshots<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Labels provide a named snapshot of file revisions. The original cheat sheet uses a two-step pattern: create label metadata, then populate label contents.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Create and populate a label<\/span>\np4 label xxx\np4 labelsync -l xxx\np4 labelsync -l xxx file1 file2\n\n<span class=\"hljs-comment\"># Copy one label's contents into a new label<\/span>\np4 label -t xxx abc\np4 labelsync -l abc <span class=\"hljs-comment\">\/\/...@xxx<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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\">Working offline and reconciling later<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original guide includes a practical recovery pattern for edits made while disconnected: detect edits, deletions, and additions, then open files in Perforce accordingly.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">p4 diff -se | p4 -x - edit\np4 diff -sd | p4 -x - <span class=\"hljs-keyword\">delete<\/span>\nfind . -type f -print | p4 -x - add\n\np4 opened\np4 diff<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Administration commands from the original sheet<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>Use<\/th><th>Access level<\/th><\/tr><\/thead><tbody><tr><td><code>p4 admin checkpoint<\/code><\/td><td>Create a checkpoint<\/td><td>Administrator (super)<\/td><\/tr><tr><td><code>p4 protect<\/code><\/td><td>Edit protections\/permissions<\/td><td>Administrator<\/td><\/tr><tr><td><code>p4 protects<\/code><\/td><td>Show effective permissions<\/td><td>Any user with command access<\/td><\/tr><tr><td><code>p4 client<\/code> (set <code>compress<\/code>)<\/td><td>Enable client-side network compression in workspace options<\/td><td>Workspace owner<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Check before submit:<\/strong> run <code>p4 opened<\/code> and <code>p4 diff<\/code> so your changelist contains only intended files.<\/li><li><strong>Use <code>p4 revert<\/code> carefully:<\/strong> the original sheet explicitly warns it is irreversible for unopened\/unsubmitted work.<\/li><li><strong>Be cautious with selective integrations:<\/strong> review merge choices carefully, especially when reversing flow with <code>-r<\/code>.<\/li><li><strong>Standardize branch specs:<\/strong> consistent naming makes <code>p4 integ -b ...<\/code> and <code>p4 diff2 -b ...<\/code> much safer to reuse.<\/li><li><strong>Verify behavior against your installed Perforce version:<\/strong> some notes in the 2009-era sheet reference older releases and may differ in modern environments.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A practical Perforce CLI reference for choosing the right p4 command quickly. Covers data-mining commands, workspace flow, revision syntax, branching, labels, and admin tasks.<\/p>\n","protected":false},"author":1,"featured_media":4061,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[370],"tags":[3203,824,3206,384,3210,3211,3209,2837,373,3207,3204,3205,3213,3217,3216,3214,3215,3212,3208],"class_list":["post-133","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perforce","tag-cheat-sheet","tag-command-line","tag-data-mining-commands","tag-p4","tag-p4-changes","tag-p4-filelog","tag-p4-files","tag-p4v","tag-perforce","tag-perforce-command-reference","tag-perforce-command-line","tag-perforce-command-line-cheat-sheet","tag-perforce-command-line-guide","tag-perforce-command-line-help","tag-perforce-command-line-list","tag-perforce-command-line-reference","tag-perforce-command-line-resource","tag-perforce-command-line-tutorial","tag-reference-guide"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/133","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=133"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/133\/revisions"}],"predecessor-version":[{"id":78982,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/133\/revisions\/78982"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4061"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}