Как тиражировать git-checkout, используя только сантехнические команды?
Я хотел бы избежать вызова фарфоровых команд из моих сценариев, но есть ли способ получить некоторые из поведения git checkout <commit>
используя только сантехнические команды, такие как checkout-index
? Меня особенно интересует влияние на рабочую копию: при условии, что все чисто, checkout
удаляет файлы, которые были отслежены в старом HEAD и отсутствуют в новом. checkout-index
Похоже, что нет концепции удаления файлов. Самое близкое, что я могу придумать, это позвонить
git diff-tree -p <old> <new> | git apply
но вычисление всего различий кажется излишне дорогим. Есть ли способ лучше?
1 ответ
Вы ищете два дереваgit read-tree -um
, Он использует базовое дерево, (как правило, вы кормите его HEAD
), целевое дерево и (неявно) индекс и рабочее дерево. Таблицу, описывающую ее поведение, было трудно понять, поэтому у меня есть собственная таблица для нее, переформатированная, которая в любом случае имеет для меня больший смысл. Во всяком случае, он реализует 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.