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