You're looking for the two-tree git read-tree -um
. It uses a base tree, (generally you feed it HEAD
), a target tree, and (implicitly) the index and worktree. The table describing its behavior was hard for me to understand so I have my own cheatsheet for it, a reformatted one that makes more sense to me, anyway. At any rate, it implements git checkout
.
git read-tree -um H M # `I` is the (implicit) index, GIT_INDEX_FILE
Legend
H Original tree (usually HEAD:)
I Indexed tree
M Merge target tree
H->I \
H->M } status in second relative to first
I->M /
"-" file exists in neither
new exists only in second
deleted exists only in first
same exists in both, unchanged
changed exists in both, different
(blank) irrelevant or all cases not otherwise given
keep keep current version
fail whole command fails, no changes
delete delete worktree file
H->I H->M I->M
same keep
deleted changed fail
deleted deleted delete
deleted same delete unless Index empty, else use M
same keep
same changed worktree clean: use M; dirty: fail
same deleted worktree clean: deleted; dirty: fail
new - keep
new new changed fail
changed changed changed fail
changed deleted fail
note: "index empty" identifies an initial checkout, where HEAD has been
set but never loaded. git can't currently distinguish between a
delete-everything index and an initial-checkout index.
git checkout ...
? – Lastercheckout
can blow away ignored files, and I want to avoid doing that (increased safety). But I do want pave over deleted files (decreased safety), without using--force
to pave over everything. This is part of a script that's using git under the covers to store file trees, andcheckout
is very close to how I want my script to behave, but not quite. I figured if I could getcheckout
with plumbing commands I could tweak it from there, though please let me know if there's another way to get this control. – Sherlockdiff-tree
is slow?checkout
basically diffs everything to figure out what to do in the first place. (Of course,checkout
doesn't create patches and then apply them, and probably you shouldn't either.) – Ethelreddiff-tree
is probably what I want, but I'm not sure what to pipe its output into. Is there a way to apply this diff to the working copy besides thegit apply
hack above? It would be easy enough to write a Python script to take the list of deletions and actually perform them, but I worry that would be slow. – Sherlock