Я хочу сбросить файлы до предыдущей фиксации, но остаться на текущей фиксации. Итак, если я сделаю:
git init
touch 1; git add 1; git commit -m "1"
touch 2; git add 2; git commit -m "2"
touch 3; git add 3; git commit -m "3"
Это произведет 3 коммита. Я хочу остаться на коммите № 3, но сбросить этап до состояния, которое у меня было на коммите № 2. Я попытался сделать следующее:
git reset --(hard|soft|mixed|merge|keep)
git checkout
git revert
Итак, после какой-то волшебной команды blah
я хочу получить следующий результат:
git log
показывает, что HEAD все еще находится на коммите № 3ls .
показывает, что в моей файловой системе есть только файлы 1
и 2
.git diff
или git diff --cached
показывает, что файл 3
был удален.Я могу сделать git reset --hard <hash-2>
, но это переместит HEAD
на коммит #2.
@CodeCaster Я не хочу двигать ГОЛОВУ. Если я наберу git log
, я хочу видеть коммит №3 сверху.
Это не имеет большого смысла для меня. Объясните свой сценарий, а не желаемый конечный результат.
Я объяснил сценарий выше, я хочу продолжить работу с изменениями, которые у меня были несколько коммитов назад на моем этапе. Я не хочу создавать новые коммиты или двигать головой. Я хочу изменить эти изменения и только после этого создать новую фиксацию.
Итак, вы хотите разветвиться на коммите 2, внести некоторые другие изменения, а затем воспроизвести изменения коммита 3 на эти изменения? Вы действительно хотите «вставить» фиксацию между 2 и 3? Вот что я имел в виду, объясняя сценарий, а не результат.
Теперь я вообще не хочу создавать ветки. Наверное, я вообще даже не хочу в историю, я этого еще не знаю, наверное, я это решу в будущем, когда начну работать над своими изменениями. Если вы используете Jetbrains IDE, у него есть локальная история, вы можете сбросить все файлы на любой этап, который у них был до этого, и это никак не повлияет на .git
репозиторий. Я хочу сделать то же самое, но с фиксацией.
Используйте это, чтобы вернуть определенные файлы к данной фиксации. Ваша ГОЛОВА останется прежней.
git checkout <commit-hash> -- file1/to/restore
Я видел этот ответ, но понятия не имею, какие файлы у меня были в этом коммите. Кроме того, я понятия не имел, какие файлы были добавлены или удалены
Да, это путь. И чтобы восстановить все файлы до состояния этой фиксации, просто git checkout <commitHash> -- .
Это не удаляет файлы, которые у меня есть сейчас. Если я это сделаю git checkout hash-commit-2
, у меня все еще будут файлы 1-2-3 в моей файловой системе. Я хочу полностью сбросить свою сцену до коммита, который у меня был раньше. Тот же результат я могу заархивировать с помощью git reset --hard
, но эта команда переместит HEAD
Что бы вы сделали git checkout hash-commit-2
хотя никто этого не предлагал? Вы действительно пробовали git checkout hash-commit-2 -- .
?
Один из способов сделать это за 3 шага:
a=$(git rev-parse HEAD)
git reset --hard #hash-commit-2
git reset --soft $a
git revert HEAD -n
С помощью -n
или --no-commit
он отменяет изменения в рабочем дереве и индексе, но не создает фиксацию. HEAD
можно заменить другим эквивалентным коммитом. Если вы хотите зафиксировать откат, вам нужно запустить git commit
.
Если вы хотите отменить некоторые последовательные коммиты, например, в своем комментарии,
git revert HEAD~3..HEAD -n
Это возвращает только один коммит. В сценарии у меня есть 10 коммитов, и я хочу сбросить свою стадию, чтобы коммит № 7 я должен сделать git revert #10
git revert #9
git revert #8
. В любом случае спасибо, я не знал о --no-commit
аргументе.
Вы можете поместить любое дерево (здесь: предыдущий коммит) в текущий индекс следующим образом:
git reset @~ -- .
что дает вам
> git status --short
D 3
?? 3
Это довольно сложно. Он не изменяет файлы. Он оставляет файлы одинаковыми. Но поэтапно изменения были внесены в коммиты. Итак, git diff --cached
и git diff
показывают противоположные изменения. Например. 1) +a
и 2) -a
Что именно вы подразумеваете под «оставаться на коммите № 3»? Если вы сбрасываете до коммита 2, то вы больше не выполняете коммит 3, а работаете над коммитом 4, который отменяет то, что было сделано в коммите 3.