Version 1 vs 3
Version 1 vs 3
Edits
Edits
- Edit by epriestley, Version 3
- Jul 29 2012 12:03 AM
- Edit by epriestley, Version 1
- May 8 2012 8:12 PM
Edit Older Version 1... | Edit Current Version 3... |
Content Changes
Content Changes
Descriptions of Arcanist workflows.
= Official epriestley Workflow =
This is how I use `arc` with Git.
I use an amend/rebase mutable-history workflow where each idea is always represented by one commit. I never make checkpoint commits, and I never write Git commit messages, and I never merge. I have two shell aliases:
- `wip`: ("work in progress") `git commit -a -m WIP`
- `squish`: `git status && git commit -a --amend -C HEAD`
I use TextMate to edit code. The `mate` commands below invoke the editor, although I usually locate and open files with GUI in the Finder.
To start a new change, I work in feature branches.
$ git checkout master
$ git checkout -b newfeature
$ mate somefile.php
$ wip
$ arc diff
To update a change, I amend it into HEAD.
$ mate somefile.php
$ squish
$ arc diff
To start a new feature which depends on another feature, I branch off the branch. I do this rarely.
$ git checkout newfeature
$ git checkout -b newerfeature
$ mate newfile.php
$ wip
$ arc diff
To pull in other users' changes to a first-degree branch, I rebase. I do this very rarely.
$ git rebase master
To rebase an nth-degree branch, I cherry-pick. This is usually painless, while using rebase often isn't.
$ git checkout newerfeature
$ git show # copy commit hash
$ git reset --hard newfeature
$ git cherry-pick <hash>
To push a change, I use `arc land`:
$ arc land newfeature
Descriptions of Arcanist workflows.
= Official epriestley Workflow =
This is how I use `arc` with Git.
I use an amend/rebase mutable-history workflow where each idea is always represented by one commit. I never make checkpoint commits, and I never write Git commit messages, and I never merge. I have two shell aliases:
- `wip`: ("work in progress") `git commit -a -m WIP`
- `squish`: `git status && git commit -a --amend -C HEAD`
I use TextMate to edit code. The `mate` commands below invoke the editor, although I usually locate and open files with GUI in the Finder.
To start a new change, I work in feature branches.
$ git checkout master
$ git checkout -b newfeature
$ mate somefile.php
$ wip
$ arc diff
To update a change, I amend it into HEAD.
$ mate somefile.php
$ squish
$ arc diff
To start a new feature which depends on another feature, I branch off the branch. I do this rarely.
$ git checkout newfeature
$ git checkout -b newerfeature
$ mate newfile.php
$ wip
$ arc diff newfeature
To pull in other users' changes to a first-degree branch, I rebase. I do this very rarely.
$ git rebase master
To rebase an nth-degree branch, I cherry-pick. This is usually painless, while using rebase often isn't.
$ git checkout newerfeature
$ git show # copy commit hash
$ git reset --hard newfeature
$ git cherry-pick <hash>
Alternatively, I'll use `rebase -i`:
$ git checkout newerfeature
$ git rebase -i newfeature
In many cases, just deleting every commit from the interactive rebase except HEAD results in a clean rebase.
To push a change, I use `arc land`:
$ arc land newfeature
= Facebook Workflow =
This is the major workflow used at Facebook with Git. It is similar to the "epriestley" workflow, but uses commit templates and `rebase -i` to handle Nth-degree branches. It uses "--verbatim" and makes commit messages authoritative. It does not use merges or checkpoint commits.
Set your Git commit template to the output of `echo '{"edit":"create"}' | arc call-conduit differential.getcommitmessage`. When you commit, fill out the template.
To start a new change, work in a feature branch:
$ git checkout master
$ git checkout -b newfeature
$ vim file.php
$ git commit # Fill out template
$ arc diff --verbatim
To update a change, amend:
$ vim file.php
$ git commit --amend
$ arc diff --verbatim
To start a feature which depends on another feature, stack the commits:
$ vim file.php
$ git commit # Fill out template
$ arc diff --verbatim HEAD^
To edit the previous feature, use `rebase -i`:
$ git rebase -i master
# Now, pick "edit" for the commit you want to edit.
To rebase the stack, use `git rebase`:
$ git rebase
Facebook pushes changes with `git svn dcommit` because its backing VCS is SVN. This is unusual.
Descriptions of Arcanist workflows.
= Official epriestley Workflow =
This is how I use `arc` with Git.
I use an amend/rebase mutable-history workflow where each idea is always represented by one commit. I never make checkpoint commits, and I never write Git commit messages, and I never merge. I have two shell aliases:
- `wip`: ("work in progress") `git commit -a -m WIP`
- `squish`: `git status && git commit -a --amend -C HEAD`
I use TextMate to edit code. The `mate` commands below invoke the editor, although I usually locate and open files with GUI in the Finder.
To start a new change, I work in feature branches.
$ git checkout master
$ git checkout -b newfeature
$ mate somefile.php
$ wip
$ arc diff
To update a change, I amend it into HEAD.
$ mate somefile.php
$ squish
$ arc diff
To start a new feature which depends on another feature, I branch off the branch. I do this rarely.
$ git checkout newfeature
$ git checkout -b newerfeature
$ mate newfile.php
$ wip
$ arc diff newfeature
To pull in other users' changes to a first-degree branch, I rebase. I do this very rarely.
$ git rebase master
To rebase an nth-degree branch, I cherry-pick. This is usually painless, while using rebase often isn't.
$ git checkout newerfeature
$ git show # copy commit hash
$ git reset --hard newfeature
$ git cherry-pick <hash>
Alternatively, I'll use `rebase -i`:
$ git checkout newerfeature
$ git rebase -i newfeature
In many cases, just deleting every commit from the interactive rebase except HEAD results in a clean rebase.
To push a change, I use `arc land`:
$ arc land newfeature
= Facebook Workflow =
This is the major workflow used at Facebook with Git. It is similar to the "epriestley" workflow, but uses commit templates and `rebase -i` to handle Nth-degree branches. It uses "--verbatim" and makes commit messages authoritative. It does not use merges or checkpoint commits.
Set your Git commit template to the output of `echo '{"edit":"create"}' | arc call-conduit differential.getcommitmessage`. When you commit, fill out the template.
To start a new change, work in a feature branch:
$ git checkout master
$ git checkout -b newfeature
$ vim file.php
$ git commit # Fill out template
$ arc diff --verbatim
To update a change, amend:
$ vim file.php
$ git commit --amend
$ arc diff --verbatim
To start a feature which depends on another feature, stack the commits:
$ vim file.php
$ git commit # Fill out template
$ arc diff --verbatim HEAD^
To edit the previous feature, use `rebase -i`:
$ git rebase -i master
# Now, pick "edit" for the commit you want to edit.
To rebase the stack, use `git rebase`:
$ git rebase
Facebook pushes changes with `git svn dcommit` because its backing VCS is SVN. This is unusual.