This "single branch, related commits" approach is exactly what came to my mind as well.
But, isn`t Perforce "changelist" an "atomic" group of changes - like "commit" in Git, "changeset" in Team Foundation Version Control, etc...?
If so, it would mean that this "multiple pending changelists" flow would/should be translated to "multiple pending commits" in Git, where in the end _a single_ Perforce "changelist" is _a single_ Git "commit".
Might be this is where the confusion is coming from, trying to fit natural Git "multiple commits per feature" (but "single feature per branch") concept into a "single changelist per feature" Perforce concept, described/required here?
I don`t think there is a firm concept of such "multiple pending commits" in Git, but the point is the author is having multiple changelists/commits, and it actively updates them (the _same ones_), until they`re ready to be merged (submitted, in Perforce)... which you can do in Git, and might be quite easily :)
So... In Git, you can create a separate commit for each changelist you have in Perforce (all these commits being on the same branch, as desired). Then, when you would have wanted to "update" the pending Perforce changelist (not sure what the corresponding command is in Perforce), you would just `git commit` your current state with additional "--squash" or "--fixup" parameters (depending on if you would like to add more description to existing/original commit message, or not), and the original commit SHA1.
In the end, when everything is tested together and you would like to commit features separately (like submitting changelists in Perforce), you would just need to `git rebase -i --autosquash` your branch, where Git would squash all your "update" commits (fixup/squash ones, that is) to the original/initial ones you made as per your changelists/features. No need for manual rearranging, cherry-picking, or whatever.
An example flow, with two "changelists" for two features (I`ll be using capital letters A, B, C... instead of commit SHA1, for simplicity):
... do some "Feature 1" work...
$ git commit -m "Feature 1"
... do some "Feature 2" work...
$ git commit -m "Feature 2"
... do some "Feature 1" work...
$ git commit --fixup A
... do some "Feature 1" work...
$ git commit --fixup A
... do some "Feature 2" work...
$ git commit --squash B
... do some "Feature 1" work...
$ git commit --fixup A
... do some "Feature 1" work...
$ git commit --squash A
... do some "Feature 2" work...
$ git commit --fixup B
Branch history would look something like this (H is latest commit):
H fixup! Feature 2
G squash! Feature 1
F fixup! Feature 1
E squash! Feature 2
D fixup! Feature 1
C fixup! Feature 1
B Feature 2
A Feature 1
When you finally do `git rebase -i --autosquash A^`, you should get a list like this[1]:
pick A Feature 1
fixup C fixup! Feature 1
fixup D fixup! Feature 1
fixup F fixup! Feature 1
squash G squash! Feature 1
pick B Feature 2
squash E squash! Feature 2
fixup H fixup! Feature 2
Once rebase is finished, you`ll end up with branch history looking like this:
B' Feature 2
A' Feature 1
... where commits A, C, D, F and G have been squashed into a single commit A', and commits B, E and H have been squashed into a single commit B'. These two single commits should correspond to your two Perforce changelists.
Now you can merge your commits separately, as desired ("submit" the "changelists").
You can even first rearrange/split/squash them further, or make separate branches out of them, whatever you find appropriate - you can do whatever you like to them while they`re your local commits ("pending changelists"), before making them live/visible for other users as well (merge them to a public branch, "submit changelist").
p.s. Doesn`t the flow required here look similar to Mercurial patch "queues" approach (again, resembling "quilt" functionality)? If so, "Guilt"[2] may be an option here as well... if the described flow can`t be altered a bit to align better with Git itself, might be profiting on the side of overall workflow simplicity ;)
[1] Having commits automatically grouped/ordered, you can even
replace some "fixup" and "squash" with "reword", for example, so
those commits are kept as separate ones, providing you a chance
to edit their messages.
[2] http://repo.or.cz/w/guilt.gitRegards, Buga