Ответ 1
git rm -r .
git checkout HEAD~3 .
git commit
После фиксации файлы в новом HEAD
будут такими же, как в версии HEAD~3
.
В Git, скажем, я испортил свои коммиты, и я хочу, чтобы версия 3 завершалась как новая версия. Если я делаю git checkout xxxx
, он создает новую ветку, и кажется, что я могу только объединить ее? Могу ли я сделать это новой "главной версией"?
Я хочу:
A-B-C-D-E
чтобы стать
A-B-C-D-E-F
где F имеет точно такое же содержание, как C
Если я использую git revert xxxx
вместо этого, похоже, что он определенно будет иметь конфликты, и мне нужно его вручную разрешить.
То, что я действительно хочу, - это просто сделать старую фиксацию в какой-то момент новой фиксацией, независимо от того, что в моем рабочем каталоге или последней фиксации.
Как мне это сделать?
git rm -r .
git checkout HEAD~3 .
git commit
После фиксации файлы в новом HEAD
будут такими же, как в версии HEAD~3
.
Похоже, вы просто хотите reset до C; то есть дерево:
А-В-С
Вы можете сделать это с помощью reset
:
git reset --hard HEAD~3
(Примечание: вы сказали, что три коммита назад, так что то, что я написал, в вашем примере C всего две минуты назад, поэтому вы можете использовать HEAD~2
)
Вы также можете использовать revert
, если хотите, хотя, насколько я знаю, вам нужно делать реверты по одному за раз:
git revert HEAD # Reverts E
git revert HEAD~2 # Reverts D
Это создаст новый фиксатор F, который будет таким же содержимым, как D и G, тем же содержимым, что и C. Вы можете rebase
вырезать их вместе, если хотите
Это именно то, что я хотел сделать. Я не был уверен в предыдущей команде git cherry-pick C
, это звучит неплохо, но кажется, что вы делаете это, чтобы получать изменения с другой ветки, но не на одной ветки, кто-нибудь пробовал это?
Итак, я сделал что-то еще, что тоже сработало: Я получил файлы, которые я хотел вернуть из старого файла фиксации по файлу
git checkout <commit-hash> <filename>
ex: git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css
- > это принимает файлы, как они были из старого commit
Затем я сделал свои изменения. И я снова совершил.
git status (to check which files were modified)
git diff (to check the changes you made)
git add .
git commit -m "my message"
Я проверил свою историю с помощью git log
, и у меня все еще есть моя история вместе с моими новыми изменениями, сделанными из старых файлов. И я тоже мог нажать.
Обратите внимание, что для возврата к состоянию, которое вы хотите, нужно поместить хэш фиксации перед нежелательными изменениями. Также убедитесь, что у вас нет незафиксированных изменений, прежде чем вы это сделаете.
eloone сделал файл по файлу
git checkout <commit-hash> <filename>
но вы можете легко проверить все файлы, выполнив
git checkout <commit-hash> .
git cherry-pick C
где C - хеш фиксации для C. Это применяется к старой фиксации поверх самой новой.
Другие ответы до сих пор создают новые коммиты, которые отменят то, что в старших коммитах. Можно вернуться и "изменить историю" как есть, но это может быть немного опасно. Вы должны делать это только в том случае, если комманда, которую вы меняете, не была перенесена в другие репозитории.
Команда, которую вы ищете, это git rebase --interactive
Если вы хотите изменить HEAD ~ 3, команда, которую вы хотите опубликовать, - git rebase --interactive HEAD~4
. Это откроет текстовый редактор и позволит вам указать, какие коммиты вы хотите изменить.
Практикуйтесь в другом хранилище, прежде чем попробовать это с чем-то важным. Страницы руководства должны предоставить вам всю необходимую информацию.