Оформить старый коммит и сделать его новым

На 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, Это откроет текстовый редактор и позволит вам указать, какие коммиты вы хотите изменить.

Потренируйтесь в другом хранилище, прежде чем попробовать это с чем-то важным. Страницы руководства должны предоставить вам всю остальную информацию, которая вам нужна.

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