Проверьте старый коммит и сделайте его новым коммитом [дубликат]



этот вопрос уже есть ответ здесь:



на Git, скажем, я испортил свои коммиты, и я хочу сделать версию 3 коммитов назад как новую версию. Если я это сделаю git checkout xxxx, Он создает новую ветку и кажется, что я могу только слить его? Могу ли я сделать это новая "мастер-версия"?



хочу:



A-B-C-D-E


стать



A-B-C-D-E-F


где F имеет точно такое же содержание как C



если я использую git revert xxxx вместо этого, похоже, что он определенно будет иметь конфликты, и мне нужно вручную решить его.



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



как бы я это сделал это?

455   6  
git

6 ответов:

git rm -r .
git checkout HEAD~3 .
git commit

после фиксации, файлы в новом HEAD будет такой же, как они были в редакции HEAD~3.

похоже, вы просто хотите сбросить до C; то есть сделать дерево:

Б

С reset:

git reset --hard HEAD~3

(Примечание: Вы сказали три коммита назад, так что это то, что я написал; в вашем примере C только два коммита назад, так что вы можете использовать HEAD~2)


вы также можете использовать revert если вы хотите, хотя, насколько я знаю, вам нужно сделать реверс один на a время:

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, и у меня все еще есть моя история вместе с моими новыми изменениями, сделанными из старых файлов. И я тоже мог толкать.

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

элоун сделал это файл за файлом с

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

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

Comments

    Ничего не найдено.