On Sun, Oct 14, 2018 at 4:25 PM Junio C Hamano <gitster@xxxxxxxxx> wrote: > > Matthew DeVore <matvore@xxxxxxxxxx> writes: > > > -List commits that are reachable by following the `parent` links from the > > -given commit(s), but exclude commits that are reachable from the one(s) > > -given with a '{caret}' in front of them. The output is given in reverse > > -chronological order by default. > > +List objects that are reachable by following references from the given > > +object(s), but exclude objects that are reachable from the one(s) given > > +with a '{caret}' in front of them. > > > > +By default, only commit objects are shown, and the commits are shown in > > +reverse chronological order. The '--object' flag causes non-commit objects > > +to also be shown. > > > > +You can think of this as a set operation. Objects given on the command > > +line form a set of objects that are reachable from any of them, and then > > +objects reachable from any of the ones given with '{caret}' in front are > > +subtracted from that set. The remaining objects are what come out in the > > command's output. Various other options and paths parameters can be used > > to further limit the result. > > I am not sure if this is a good rewrite. It gives a false > impression as if you'd not see anything if I did this: > > git rev-list --objects ^master md/filter-trees:t/valgrind > Oh that's interesting. So my mental model conflicts with the command's behavior. It actually is surprising behavior because: # this shows all files that were modified in the HEAD commit git rev-list --objects ^HEAD~1^{tree} HEAD: # but this shows *all* files at HEAD git rev-list --objects ^HEAD~1 HEAD: Which means that ^commit and ^non-commit are treated inherently differently. Maybe I should fix this bug before clarifying this documentation... > It is more like "this is a set operation across commits. We also > show objects that are reachable from the commits in the resulting > set and are not reachable from the commits in the set that were > excluded when --objects option is given". > That would be correct though it wouldn't tell that you can use "--objects ^foo-tree bar-tree." Without fixing the above bug, I could add to your wording something to the effect of "You can also use trees to include and exclude sets of objects rather than commits." Which implies that mixing "--objects ^commit tree" on the command line is undefined.