Git остается на том же коммите, но возвращает файлы

Я хочу сбросить файлы до предыдущей фиксации, но остаться на текущей фиксации. Итак, если я сделаю:

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 все еще находится на коммите № 3
  • ls . показывает, что в моей файловой системе есть только файлы 1 и 2.
  • git diff или git diff --cached показывает, что файл 3 был удален.

Я могу сделать git reset --hard <hash-2>, но это переместит HEAD на коммит #2.

Что именно вы подразумеваете под «оставаться на коммите № 3»? Если вы сбрасываете до коммита 2, то вы больше не выполняете коммит 3, а работаете над коммитом 4, который отменяет то, что было сделано в коммите 3.

CodeCaster 08.04.2019 11:13

@CodeCaster Я не хочу двигать ГОЛОВУ. Если я наберу git log, я хочу видеть коммит №3 сверху.

deathangel908 08.04.2019 11:13

Это не имеет большого смысла для меня. Объясните свой сценарий, а не желаемый конечный результат.

CodeCaster 08.04.2019 11:14

Я объяснил сценарий выше, я хочу продолжить работу с изменениями, которые у меня были несколько коммитов назад на моем этапе. Я не хочу создавать новые коммиты или двигать головой. Я хочу изменить эти изменения и только после этого создать новую фиксацию.

deathangel908 08.04.2019 11:17

Итак, вы хотите разветвиться на коммите 2, внести некоторые другие изменения, а затем воспроизвести изменения коммита 3 на эти изменения? Вы действительно хотите «вставить» фиксацию между 2 и 3? Вот что я имел в виду, объясняя сценарий, а не результат.

CodeCaster 08.04.2019 11:20

Теперь я вообще не хочу создавать ветки. Наверное, я вообще даже не хочу в историю, я этого еще не знаю, наверное, я это решу в будущем, когда начну работать над своими изменениями. Если вы используете Jetbrains IDE, у него есть локальная история, вы можете сбросить все файлы на любой этап, который у них был до этого, и это никак не повлияет на .git репозиторий. Я хочу сделать то же самое, но с фиксацией.

deathangel908 08.04.2019 11:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
315
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Используйте это, чтобы вернуть определенные файлы к данной фиксации. Ваша ГОЛОВА останется прежней.

git checkout <commit-hash> -- file1/to/restore

Я видел этот ответ, но понятия не имею, какие файлы у меня были в этом коммите. Кроме того, я понятия не имел, какие файлы были добавлены или удалены

deathangel908 08.04.2019 11:15

Да, это путь. И чтобы восстановить все файлы до состояния этой фиксации, просто git checkout <commitHash> -- .

Romain Valeri 08.04.2019 11:17

Это не удаляет файлы, которые у меня есть сейчас. Если я это сделаю git checkout hash-commit-2, у меня все еще будут файлы 1-2-3 в моей файловой системе. Я хочу полностью сбросить свою сцену до коммита, который у меня был раньше. Тот же результат я могу заархивировать с помощью git reset --hard, но эта команда переместит HEAD

deathangel908 08.04.2019 11:19

Что бы вы сделали git checkout hash-commit-2 хотя никто этого не предлагал? Вы действительно пробовали git checkout hash-commit-2 -- .?

Romain Valeri 08.04.2019 11:46

Один из способов сделать это за 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 #10git revert #9git revert #8. В любом случае спасибо, я не знал о --no-commit аргументе.

deathangel908 08.04.2019 11:49

Вы можете поместить любое дерево (здесь: предыдущий коммит) в текущий индекс следующим образом:

git reset @~ -- .

что дает вам

> git status --short
D  3
?? 3

Это довольно сложно. Он не изменяет файлы. Он оставляет файлы одинаковыми. Но поэтапно изменения были внесены в коммиты. Итак, git diff --cached и git diff показывают противоположные изменения. Например. 1) +a и 2) -a

deathangel908 16.04.2019 18:58

Другие вопросы по теме