Pull
Workflow
- Verify git status is clean or commit/stash changes before merging.
- Ensure rerere is enabled locally:
git config rerere.enabled true
git config rerere.autoupdate true
- Confirm remotes and branches:
- Ensure the
origin remote exists.
- Ensure the current branch is the one to receive the merge.
- Fetch latest refs:
- Sync the remote feature branch first:
git pull --ff-only origin $(git branch --show-current)
- This pulls branch updates made remotely (for example, a GitHub auto-commit)
before merging
origin/main.
- Merge in order:
- Prefer
git -c merge.conflictstyle=zdiff3 merge origin/main for clearer
conflict context.
- If conflicts appear, resolve them (see conflict guidance below), then:
git add <files>
git commit (or git merge --continue if the merge is paused)
- Verify with project checks (follow repo policy in
AGENTS.md).
- Summarize the merge:
- Call out the most challenging conflicts/files and how they were resolved.
- Note any assumptions or follow-ups.
Conflict Resolution Guidance (Best Practices)
- Inspect context before editing:
- Use
git status to list conflicted files.
- Use
git diff or git diff --merge to see conflict hunks.
- Use
git diff :1:path/to/file :2:path/to/file and
git diff :1:path/to/file :3:path/to/file to compare base vs ours/theirs
for a file-level view of intent.
- With
merge.conflictstyle=zdiff3, conflict markers include:
<<<<<<< ours, ||||||| base, ======= split, >>>>>>> theirs.
- Matching lines near the start/end are trimmed out of the conflict region,
so focus on the differing core.
- Summarize the intent of both changes, decide the semantically correct
outcome, then edit:
- State what each side is trying to achieve (bug fix, refactor, rename,
behavior change).
- Identify the shared goal, if any, and whether one side supersedes the
other.
- Decide the final behavior first; only then craft the code to match that
decision.
- Prefer preserving invariants, API contracts, and user-visible behavior
unless the conflict clearly indicates a deliberate change.
- Open files and understand intent on both sides before choosing a resolution.
- Prefer minimal, intention-preserving edits:
- Keep behavior consistent with the branch’s purpose.
- Avoid accidental deletions or silent behavior changes.
- Resolve one file at a time and rerun tests after each logical batch.
- Use
ours/theirs only when you are certain one side should win entirely.
- For complex conflicts, search for related files or definitions to align with
the rest of the codebase.
- For generated files, resolve non-generated conflicts first, then regenerate:
- Prefer resolving source files and handwritten logic before touching
generated artifacts.
- Run the CLI/tooling command that produced the generated file to recreate it
cleanly, then stage the regenerated output.
- For import conflicts where intent is unclear, accept both sides first:
- Keep all candidate imports temporarily, finish the merge, then run lint/type
checks to remove unused or incorrect imports safely.
- After resolving, ensure no conflict markers remain:
- When unsure, note assumptions and ask for confirmation before finalizing the
merge.
When To Ask The User (Keep To A Minimum)
Do not ask for input unless there is no safe, reversible alternative. Prefer
making a best-effort decision, documenting the rationale, and proceeding.
Ask the user only when:
- The correct resolution depends on product intent or behavior not inferable
from code, tests, or nearby documentation.
- The conflict crosses a user-visible contract, API surface, or migration where
choosing incorrectly could break external consumers.
- A conflict requires selecting between two mutually exclusive designs with
equivalent technical merit and no clear local signal.
- The merge introduces data loss, schema changes, or irreversible side effects
without an obvious safe default.
- The branch is not the intended target, or the remote/branch names do not exist
and cannot be determined locally.
Otherwise, proceed with the merge, explain the decision briefly in notes, and
leave a clear, reviewable commit history.
1---
2name: pull
3description:
4 Pull latest origin/main into the current local branch and resolve merge
5 conflicts (aka update-branch). Use when Codex needs to sync a feature branch
6 with origin, perform a merge-based update (not rebase), and guide conflict
7 resolution best practices.
8---
9
10# Pull
11
12## Workflow
13
141. Verify git status is clean or commit/stash changes before merging.
152. Ensure rerere is enabled locally:
16 - `git config rerere.enabled true`
17 - `git config rerere.autoupdate true`
183. Confirm remotes and branches:
19 - Ensure the `origin` remote exists.
20 - Ensure the current branch is the one to receive the merge.
214. Fetch latest refs:
22 - `git fetch origin`
235. Sync the remote feature branch first:
24 - `git pull --ff-only origin $(git branch --show-current)`
25 - This pulls branch updates made remotely (for example, a GitHub auto-commit)
26 before merging `origin/main`.
276. Merge in order:
28 - Prefer `git -c merge.conflictstyle=zdiff3 merge origin/main` for clearer
29 conflict context.
307. If conflicts appear, resolve them (see conflict guidance below), then:
31 - `git add <files>`
32 - `git commit` (or `git merge --continue` if the merge is paused)
338. Verify with project checks (follow repo policy in `AGENTS.md`).
349. Summarize the merge:
35 - Call out the most challenging conflicts/files and how they were resolved.
36 - Note any assumptions or follow-ups.
37
38## Conflict Resolution Guidance (Best Practices)
39
40- Inspect context before editing:
41 - Use `git status` to list conflicted files.
42 - Use `git diff` or `git diff --merge` to see conflict hunks.
43 - Use `git diff :1:path/to/file :2:path/to/file` and
44 `git diff :1:path/to/file :3:path/to/file` to compare base vs ours/theirs
45 for a file-level view of intent.
46 - With `merge.conflictstyle=zdiff3`, conflict markers include:
47 - `<<<<<<<` ours, `|||||||` base, `=======` split, `>>>>>>>` theirs.
48 - Matching lines near the start/end are trimmed out of the conflict region,
49 so focus on the differing core.
50 - Summarize the intent of both changes, decide the semantically correct
51 outcome, then edit:
52 - State what each side is trying to achieve (bug fix, refactor, rename,
53 behavior change).
54 - Identify the shared goal, if any, and whether one side supersedes the
55 other.
56 - Decide the final behavior first; only then craft the code to match that
57 decision.
58 - Prefer preserving invariants, API contracts, and user-visible behavior
59 unless the conflict clearly indicates a deliberate change.
60 - Open files and understand intent on both sides before choosing a resolution.
61- Prefer minimal, intention-preserving edits:
62 - Keep behavior consistent with the branch’s purpose.
63 - Avoid accidental deletions or silent behavior changes.
64- Resolve one file at a time and rerun tests after each logical batch.
65- Use `ours/theirs` only when you are certain one side should win entirely.
66- For complex conflicts, search for related files or definitions to align with
67 the rest of the codebase.
68- For generated files, resolve non-generated conflicts first, then regenerate:
69 - Prefer resolving source files and handwritten logic before touching
70 generated artifacts.
71 - Run the CLI/tooling command that produced the generated file to recreate it
72 cleanly, then stage the regenerated output.
73- For import conflicts where intent is unclear, accept both sides first:
74 - Keep all candidate imports temporarily, finish the merge, then run lint/type
75 checks to remove unused or incorrect imports safely.
76- After resolving, ensure no conflict markers remain:
77 - `git diff --check`
78- When unsure, note assumptions and ask for confirmation before finalizing the
79 merge.
80
81## When To Ask The User (Keep To A Minimum)
82
83Do not ask for input unless there is no safe, reversible alternative. Prefer
84making a best-effort decision, documenting the rationale, and proceeding.
85
86Ask the user only when:
87
88- The correct resolution depends on product intent or behavior not inferable
89 from code, tests, or nearby documentation.
90- The conflict crosses a user-visible contract, API surface, or migration where
91 choosing incorrectly could break external consumers.
92- A conflict requires selecting between two mutually exclusive designs with
93 equivalent technical merit and no clear local signal.
94- The merge introduces data loss, schema changes, or irreversible side effects
95 without an obvious safe default.
96- The branch is not the intended target, or the remote/branch names do not exist
97 and cannot be determined locally.
98
99Otherwise, proceed with the merge, explain the decision briefly in notes, and
100leave a clear, reviewable commit history.