Reset Git совершать без изменения HEAD в состояние отсоединения

Я хотел бы восстановить файлы рабочей копии git для данной фиксации без установки этого фиксации в качестве фиксации HEAD.

Если я git checkout для данного коммита, я получаю отдельную HEAD, и после совершения изменений дерево компиляции будет выглядеть примерно так:

A
|
B
|
C  
| \
D  E

В то время как поведение, которое я хотел бы получить, следующее:

A
|
B
|
C
|
D
| <- git command so my files are restored to C, but my HEAD still points to D
E

Спасибо

Ответ 1

Это должно сделать это:

git reset --hard C
git reset --soft D

Сначала вы reset HEAD, index и worktree на C.
Затем вы reset HEAD (и только HEAD, как описано в Практическое использование git reset --soft?"), до D.

Обратите внимание, что фиксация в этой точке создаст новый коммит с содержимым C, заменив D на D', похожим на C.
Это изменяет историю и не сильно отличается от простой git reset --hard C.

Другой вариант: git revert C поверх D, но D все равно будет отображаться в истории, что может быть тем, чего вы не хотите.

Ответ 2

Ответ VonC требует от вас совершить кругосветное путешествие. Вы можете достичь одного и того же результата с помощью одного "git checkout"

git checkout C ./

Обратите внимание, что вы должны указать ./, иначе git будет проверять указанную ветку или зафиксировать.

Ответ 3

Команды сантехники для этого (для любого скрипта такого типа):

git read-tree C
git checkout-index -f -a

Хотя по какой-то причине я не могу понять, когда я запускаю это из script, я также должен сделать следующее после указанных выше команд, иначе я получаю сообщение об ошибке, не применяющейся к индексу:

git update-index -q --refresh