{"id":255,"date":"2026-10-13T03:41:20","date_gmt":"2026-10-13T03:41:20","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2010\/05\/13\/most-user-p4-command-line\/"},"modified":"2026-10-13T03:41:21","modified_gmt":"2026-10-13T03:41:21","slug":"most-user-p4-command-line","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/most-user-p4-command-line\/","title":{"rendered":"Perforce p4 Command-Line Reference: Daily Commands, Changelists, Sync, and Merge Workflow"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2010-05-13; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide is for DevOps engineers and developers who use the <strong>p4<\/strong> command-line client with Perforce. It turns the original quick command list into a structured reference you can use in day-to-day work: opening files, managing changelists, syncing revisions, integrating branches, and submitting safely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source article: <a href=\"https:\/\/www.devopsschool.com\/blog\/most-user-p4-command-line\/\">Most User P4 Command Line \u2013 P4 Commands Reference<\/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\/2010\/05\/p4-command-line.png\" alt=\"p4 command-line reference\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How the p4 workflow fits together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most teams follow a repeatable lifecycle: authenticate, sync, open files for add\/edit\/delete, review changelist content, resolve conflicts if needed, then submit.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Check server and workspace] --> B[p4 login]\n    B --> C[p4 sync]\n    C --> D{Work needed}\n    D -- New file --> E[p4 add]\n    D -- Modify file --> F[p4 edit]\n    D -- Remove file --> G[p4 delete]\n    E --> H[p4 change review]\n    F --> H\n    G --> H\n    H --> I[p4 resolve when needed]\n    I --> J[p4 submit]\n    J --> K[p4 have or p4 sync verify]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Core p4 commands at a glance<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>Primary purpose<\/th><th>Example<\/th><th>Practical note<\/th><\/tr><\/thead><tbody><tr><td>p4 add<\/td><td>Open new file(s) for addition<\/td><td>p4 add -t binary file.pdf<\/td><td>Can override typemap with <code>-t<\/code>.<\/td><\/tr><tr><td>p4 edit<\/td><td>Open existing file(s) for edit<\/td><td>p4 edit -t text+k doc\/*.txt<\/td><td>File is checked out in workspace metadata.<\/td><\/tr><tr><td>p4 delete<\/td><td>Open file(s) for deletion<\/td><td>p4 delete \/\/depot\/README<\/td><td>Workspace file is removed immediately; depot changes on submit.<\/td><\/tr><tr><td>p4 revert<\/td><td>Discard pending file changes<\/td><td>p4 revert \/\/depot\/&#8230;<\/td><td>Returns open files to pre-opened state.<\/td><\/tr><tr><td>p4 change<\/td><td>Create or edit changelist spec<\/td><td>p4 change<\/td><td>Use numbered changelists for better control.<\/td><\/tr><tr><td>p4 changelists<\/td><td>List pending\/submitted changelists<\/td><td>p4 changelists<\/td><td>Useful before submit or cleanup.<\/td><\/tr><tr><td>p4 submit<\/td><td>Send open file revisions to depot<\/td><td>p4 submit -c 41<\/td><td>Final depot update happens here.<\/td><\/tr><tr><td>p4 sync<\/td><td>Copy depot files to workspace<\/td><td>p4 sync \/\/depot\/proj1\/&#8230;@21<\/td><td>Supports revision and changelist targets.<\/td><\/tr><tr><td>p4 have<\/td><td>Show synced revisions in workspace<\/td><td>p4 have<\/td><td>Helps verify client state.<\/td><\/tr><tr><td>p4 integrate (p4 integ)<\/td><td>Open files for branch\/merge<\/td><td>p4 integ \/\/depot\/dev\/&#8230; \/\/depot\/rel2\/&#8230;<\/td><td>Creates targets if they do not exist.<\/td><\/tr><tr><td>p4 resolve<\/td><td>Resolve file conflicts<\/td><td>p4 resolve<\/td><td>Run after integrate\/merge steps.<\/td><\/tr><tr><td>p4 login<\/td><td>Get authentication ticket<\/td><td>p4 login<\/td><td>Needed before protected operations.<\/td><\/tr><tr><td>p4 info<\/td><td>Display client\/server connection details<\/td><td>p4 info<\/td><td>Good first diagnostic command.<\/td><\/tr><tr><td>p4 user<\/td><td>Create\/edit\/delete user specs<\/td><td>p4 user -d sammy<\/td><td>Deletion and edits may require elevated rights.<\/td><\/tr><tr><td>p4 admin<\/td><td>Administrative server operations<\/td><td>p4 admin stop<\/td><td>Restricted to admin\/superuser roles.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Command patterns you will use most<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Add new files<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use <strong>p4 add<\/strong> to open files for addition. You can set file type, assign a changelist, or force-add a literal filename pattern.<\/p>\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 add -t binary file.pdf\np4 add -c <span class=\"hljs-number\">13<\/span> *\np4 add README ~<span class=\"hljs-regexp\">\/src\/<\/span>*.c\np4 add -f *.c<\/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<h3 class=\"wp-block-heading\">Edit, delete, and revert files<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">p4 edit -t text+k doc\/*.txt\np4 delete \/\/depot\/README\np4 delete -c 40 file\np4 revert \/\/depot\/...<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Manage changelists and submit<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">p4 change\np4 change -f 25\np4 changelists\np4 submit\np4 submit -c 41<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Sync and inspect revision state<\/h3>\n\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\">p4 sync\np4 sync file.c<span class=\"hljs-comment\">#4<\/span>\np4 sync <span class=\"hljs-comment\">\/\/depot\/proj1\/...@21<\/span>\np4 have<\/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<h3 class=\"wp-block-heading\">Integrate and resolve branch changes<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">p4 integ <span class=\"hljs-comment\">\/\/depot\/dev\/... \/\/depot\/rel2\/...<\/span>\np4 resolve\np4 submit<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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\">Compare similar commands before you run them<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Command<\/th><th>When to use it<\/th><th>Immediate workspace effect<\/th><th>Depot effect<\/th><\/tr><\/thead><tbody><tr><td>p4 add<\/td><td>New file should be versioned<\/td><td>File marked open for add<\/td><td>Created in depot on submit<\/td><\/tr><tr><td>p4 edit<\/td><td>Existing tracked file is being modified<\/td><td>File marked open for edit<\/td><td>New revision stored on submit<\/td><\/tr><tr><td>p4 delete<\/td><td>Tracked file should be removed<\/td><td>File removed from workspace and opened for delete<\/td><td>Deleted in depot history on submit<\/td><\/tr><tr><td>p4 revert<\/td><td>Discard pending local change<\/td><td>Open state removed; local edits discarded<\/td><td>No new depot revision<\/td><\/tr><tr><td>p4 submit<\/td><td>Finalize pending changelist<\/td><td>Pending open files are closed<\/td><td>Depot is updated with new revision metadata<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">User, authentication, and administration commands<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These commands are commonly used during setup, troubleshooting, or admin workflows. Run administrative operations carefully, especially in shared environments.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">p4 info\np4 login\np4 passwd\np4 user\np4 user joe\np4 user -d sammy\np4 admin stop<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">P4CONFIG for repeatable local setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post mentions <strong>P4CONFIG<\/strong>. In practice, teams often use it to keep consistent local client settings. Keep secrets out of shared files and follow your organization policies.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\"><span class=\"hljs-keyword\">export<\/span> P4CONFIG=.p4config\np4 info<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">P4PORT=perforce.example.com:1666\nP4USER=your-user\nP4CLIENT=your-workspace<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Common pitfalls and best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Open files with <code>p4 add<\/code>, <code>p4 edit<\/code>, or <code>p4 delete<\/code> <strong>before<\/strong> editing workflow-critical files.<\/li><li>Prefer numbered changelists for multi-file work; avoid large, mixed default changelists.<\/li><li>Sync before integrate and before submit to reduce avoidable conflict resolution.<\/li><li>Use <code>p4 have<\/code> and <code>p4 changelists<\/code> to verify state before submit.<\/li><li>Be careful with wildcard patterns like <code>*.c<\/code>; shell expansion behavior can differ by environment.<\/li><li>Treat <code>p4 admin stop<\/code> as a controlled maintenance action, not a routine command.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A practical p4 command reference for engineers who work in Perforce environments. Learn core commands, how they fit into the change lifecycle, and safer patterns for submit and merge operations.<\/p>\n","protected":false},"author":1,"featured_media":4382,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[370],"tags":[4152,1961,4150,4154,4151,4155,4148,4149,4157,4153,3204,4147,4156],"class_list":["post-255","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-perforce","tag-list-of-p4-commands","tag-p4-command-line","tag-p4-command-line-guide","tag-p4-command-line-introduction","tag-p4-command-line-list","tag-p4-command-line-quick-guide","tag-p4-command-line-reference","tag-p4-command-reference","tag-p4-commands-for-users","tag-p4-commands-overview","tag-perforce-command-line","tag-perforce-p4-commands","tag-user-p4-commands"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/255","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=255"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/255\/revisions"}],"predecessor-version":[{"id":79083,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/255\/revisions\/79083"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4382"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}