| name | tools-p4-resolve |
| description | Perforce conflict resolution including merge strategies, 3-way merge, resolve workflows, and handling binary conflicts. |
Perforce Conflict Resolution
Overview
Conflicts occur when multiple users modify the same file. Perforce provides powerful resolve tools for merging changes. This skill covers all resolve strategies and workflows.
When to Use
- After syncing when files have conflicts
- Before submitting changes
- When integrating between branches
- Handling binary file conflicts
- Resolving content vs attribute conflicts
Core Concepts
Conflict Types
| Type | Description | Resolution |
|---|
| Content | Both versions modified same lines | Merge or choose version |
| Attribute | File type or permissions changed | Choose attribute |
| Delete | File deleted in one version, modified in other | Keep or delete |
| Move/Delete | File moved and deleted | Choose action |
| Binary | Binary file modified by both | Choose version (no merge) |
Three-Way Merge
Base (common ancestor)
|
+-- Theirs (depot/source)
|
+-- Yours (workspace)
|
v
Merged Result
Basic Resolve
Check for Conflicts
p4 resolve -n
p4 resolve -n //depot/project/...
p4 resolve -n file.txt
Automatic Resolve
p4 resolve -am
p4 resolve -am //depot/project/...
p4 resolve -am file.txt
Resolve Strategies
p4 resolve -am
p4 resolve -at
p4 resolve -ay
p4 resolve -at //...
p4 resolve -ay //...
Interactive Resolve
Launch Interactive Resolve
p4 resolve
p4 resolve file.txt
p4 resolve -t p4merge file.txt
Interactive Menu Options
Diff results:
1: Accept theirs (loses your changes)
2: Accept yours (loses depot changes)
3: Accept merge result
4: Edit merge result
5: Show differences (base to theirs)
6: Show differences (base to yours)
7: Show differences (yours to theirs)
8: Skip this file
9: Help
Choose option:
Interactive Workflow
p4 resolve file.txt
Merge Tools
Configure P4 Merge Tool
export P4MERGE=/usr/local/bin/p4merge
export P4MERGE=/usr/local/bin/code
export P4MERGE=/usr/local/bin/meld
export P4MERGE=/usr/bin/vimdiff
P4Merge Workflow
p4 resolve -t file.txt
Visual Studio Code Merge
export P4MERGE="code --wait --merge"
p4 resolve file.txt
Resolve Scenarios
Simple Auto-Merge
p4 sync
p4 resolve -am
Conflicting Changes
p4 sync
p4 resolve -am
p4 resolve -at file.txt
p4 resolve -ay file.txt
p4 resolve file.txt
Binary File Conflicts
p4 sync
p4 resolve -n
p4 resolve -at image.psd
p4 resolve -ay image.psd
Delete vs Edit Conflict
p4 sync
p4 resolve -n
p4 resolve -ay file.txt
p4 resolve -at file.txt
Advanced Resolve
Partial Resolve
p4 resolve -c //...
p4 resolve -A //...
p4 resolve -Aa //...
p4 resolve -Ab //...
p4 resolve -At //...
Re-Resolve
p4 resolve -f file.txt
p4 resolve -f -at file.txt
Resolve During Integration
p4 integrate //depot/dev/... //depot/main/...
p4 resolve -am //depot/main/...
p4 resolve //depot/main/...
Safe Resolve Workflow
p4 resolve -n
p4 resolve -am
p4 resolve -n
p4 resolve remaining_file.txt
p4 resolve -n
Conflict Markers
Understanding Markers
When editing merge result manually:
<<<<<<< THEIRS (depot version)
code from depot
=======
code from your workspace
>>>>>>> YOURS (workspace version)
Resolving Markers
vim file.txt
<<<<<<< THEIRS
function getValue() {
return this.value;
}
=======
function getValue() {
return this.cachedValue || this.value;
}
>>>>>>> YOURS
# Resolved (choose best version or combine):
function getValue() {
return this.cachedValue || this.value;
}
# Save and mark resolved
p4 resolve -am file.txt
Resolve Workflows
Pre-Submit Workflow
#!/bin/bash
p4 sync
CONFLICTS=$(p4 resolve -n 2>&1 | grep -c "resolve")
if [ "$CONFLICTS" -gt 0 ]; then
echo "Found $CONFLICTS files needing resolve"
p4 resolve -am
REMAINING=$(p4 resolve -n 2>&1 | grep -c "resolve")
if [ "$REMAINING" -gt 0 ]; then
echo "Manual resolve needed for $REMAINING files"
p4 resolve -n
exit 1
fi
fi
echo "Ready to submit"
Integration Workflow
p4 integrate //depot/feature/... //depot/main/...
p4 resolve -n //depot/main/...
p4 resolve -am //depot/main/...
p4 resolve //depot/main/...
p4 submit -d "Integrate feature to main"
Batch Resolve Pattern
p4 resolve -at //depot/project/...
p4 resolve -ay //depot/project/...
p4 resolve -at //depot/project/Assets/...
p4 resolve -am //depot/project/Scripts/...
Undoing Resolve
Revert and Re-Sync
p4 revert file.txt
p4 sync file.txt
p4 edit file.txt
Back Out Bad Merge
p4 sync //depot/project/file.txt#head-1
p4 edit file.txt
p4 sync -f //depot/project/file.txt#head-1
p4 resolve -ay file.txt
p4 submit -d "Revert bad merge"
Best Practices
- Sync frequently - Smaller merges are easier
- Resolve before submit - Never submit unresolved
- Preview first with
p4 resolve -n
- Try auto-merge before manual
- Use visual merge tool for complex conflicts
- Test after resolve - Merged code may have bugs
- Keep changelists small - Easier to resolve
- Communicate with team about conflicting areas
- Use exclusive locks for binary files
- Document conflict resolution in submit description
Troubleshooting
| Issue | Solution |
|---|
| "Must resolve before submit" | Run p4 resolve |
| "No file(s) to resolve" | Already resolved or no conflicts |
| Merge tool not launching | Check P4MERGE setting |
| Markers left in file | Edit to remove, re-resolve |
| Wrong resolution accepted | Revert, sync, re-resolve |
| Binary conflict | Must accept one version (-at or -ay) |