Оформить покупку и зафиксировать новую фиксацию

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

Я хочу:

A-B-C-D-E

чтобы стать

A-B-C-D-E-F

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

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

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

Как мне это сделать?

Ответ 1

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

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

Ответ 2

Похоже, вы просто хотите 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 вырезать их вместе, если хотите

Ответ 3

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

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

Ответ 4

eloone сделал файл по файлу

git checkout <commit-hash> <filename>

но вы можете легко проверить все файлы, выполнив

git checkout <commit-hash> .

Ответ 5

git cherry-pick C

где C - хеш фиксации для C. Это применяется к старой фиксации поверх самой новой.

Ответ 6

Другие ответы до сих пор создают новые коммиты, которые отменят то, что в старших коммитах. Можно вернуться и "изменить историю" как есть, но это может быть немного опасно. Вы должны делать это только в том случае, если комманда, которую вы меняете, не была перенесена в другие репозитории.

Команда, которую вы ищете, это git rebase --interactive

Если вы хотите изменить HEAD ~ 3, команда, которую вы хотите опубликовать, - git rebase --interactive HEAD~4. Это откроет текстовый редактор и позволит вам указать, какие коммиты вы хотите изменить.

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