Оформить старый коммит и сделать его новым
На Git, скажем, я испортил свои коммиты, и я хочу сделать коммиты версии 3 назад новой версией. Если я сделаю git checkout xxxx
, он создает новую ветку и кажется, что я могу только слить его? Могу ли я сделать это новой "мастер-версией"?
Я хочу:
A-B-C-D-E
становиться
A-B-C-D-E-F
где F имеет точно такое же содержание, что и C
Если я использую git revert xxxx
вместо этого кажется, что у него наверняка будут конфликты, и мне нужно разрешить его вручную.
Что я действительно хочу, так это просто сделать старый коммит в какой-то момент новым коммитом, независимо от того, что находится в моем рабочем каталоге или последнем коммите.
Как бы я поступил так?
6 ответов
git rm -r .
git checkout HEAD~3 .
git commit
После фиксации файлы в новом HEAD
будет так же, как они были в ревизии HEAD~3
,
Eloone сделал это файл за файлом с
git checkout <commit-hash> <filename>
но вы могли бы оформить все файлы проще, выполнив
git checkout <commit-hash> .
Похоже, вы просто хотите сбросить до 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 с тем же содержимым, что и с. Вы можете rebase
раздавить их вместе, если хотите
Это именно то, что я хотел сделать. Я не был уверен в предыдущей команде git cherry-pick C
, это звучит хорошо, но кажется, что вы делаете это, чтобы получить изменения из другой ветви, но не в той же ветви, кто-нибудь пробовал это?
Так что я сделал кое-что еще, что также сработало: я получил нужные файлы из старого коммита файл за файлом
git checkout <commit-hash> <filename>
пример: git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css
-> это берет файлы, как они были из старого коммита
Затем я сделал свои изменения. И я снова совершил.
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
, и у меня все еще есть моя история вместе с моими новыми изменениями, сделанными из старых файлов. И я тоже мог толкать.
Обратите внимание, что для возврата в нужное вам состояние необходимо поместить хеш коммита до нежелательных изменений. Также убедитесь, что у вас нет незафиксированных изменений, прежде чем сделать это.
git cherry-pick C
где C - хеш коммита для C. Это применяет старый коммит поверх самого нового.
Другие ответы до сих пор создают новые коммиты, которые отменяют то, что есть в старых коммитах. Можно вернуться и "изменить историю", как бы то ни было, но это может быть немного опасно. Это следует делать только в том случае, если изменяемый вами коммит не был перенесен в другие репозитории.
Команда, которую вы ищете git rebase --interactive
Если вы хотите изменить HEAD~3, введите команду git rebase --interactive HEAD~4
, Это откроет текстовый редактор и позволит вам указать, какие коммиты вы хотите изменить.
Потренируйтесь в другом хранилище, прежде чем попробовать это с чем-то важным. Страницы руководства должны предоставить вам всю остальную информацию, которая вам нужна.