LINUX.ORG.RU

Git reset --hard

 , ,


0

2

Добрый день! У меня есть удаленный репозиторий - на онлайн хранилище и его локальная копия, с которой я работаю. Перед очередным коммитом по невнимательности удалил файл, и закоммитил это. И не обратил внимания. Когда увидел, нашел копию файла, и сделал коммит, в котором этот файл добавляется. После этого было сделано еще несколько коммитов, которые тоже были отправлены на сервер. Умные люди сказали, что надо сделать git reset --hart <pre-target-commit>, а после этого git push --force, что бы перезаписать историю на сервере. Так вот. Вопрос, собственно, в следующем - после того, как с помощью git reset --hard откачусь к целевому состоянию, где-нибудь можно будет взять изменения, которые были после этого коммита, что бы не переписывать кучу кода? Или как-то можно сохранить локальный репозиторий, и его использовать?

Умные люди сказали, что надо сделать git reset --hart <pre-target-commit>, а после этого git push --force, что бы перезаписать историю на сервере.

Я бы этому дяде с усами, усы бы поотрывал.

Ниче не понял: где у тебя правильная история - локально или на серваке? С какого коммита начинается разница? По топику вообще не увидел, чтобы эти репозитории отличались - что хочет ТС?

iVS ★★★★★ ()
Ответ на: комментарий от iVS

Правильной истории сейчас нет вообще. И локально, и на сервере - есть плохой коммит. Моя задача - (в идеале) - вернутся до коммита, который идет перед косячным, переделать косячный коммит, (не удалять файл) и залить на сервер - переписать историю коммитов. И залить после этого остальные изменения, которые идут после косячного коммита. Которые хотелось бы сохранить. Примерно так.

mashinapetro ()
Ответ на: комментарий от mashinapetro

Правило первое: никогда не делай это в основной ветке. Сделай

git checkout -b temp
И все изменения делай в ней. А твоя задача - исправить историю, тут нужен
git rebase --interactive <base_commit> <last_commit>
<base_commit>, <last_commit> - это хеши коммитов, первый указывает ту точку, до которой история правильна, этот коммит не будет задеваться, второй - последний коммит в истории. Дальше лучше читай про эту кухню, напротив нужного коммита ставишь edit, его редактируешь, нужное добавляешь в историю, делаешь
git commit --amend
и так далее. Но если в этом опыта нет, то гемора ты себе отхватишь.

iVS ★★★★★ ()

после того, как с помощью git reset --hard откачусь к целевому состоянию, где-нибудь можно будет взять изменения, которые были после этого коммита, что бы не переписывать кучу кода

Сделайте git reset --soft <last-good-commit> && git push -f, после сообщите всем заинтересованным. Все изменения, сделанные после останутся в индексе. Также можете почитать про git help reflog.

backbone ★★★★★ ()
Последнее исправление: backbone (всего исправлений: 2)

1. Сделай отдельную временную ветку (например, temp001).

2. Сделай в ней «git reset --hard <pre-target-commit>».

3. Перенеси последовательно нужные коммиты с помощью «git cherry-pick <commit>», внося необходимые правки.

4. Сделай в целевой ветке «git reset --hard <pre-target-commit>».

5. Влей в неё временную.

6. Проверь все ещё раз.

7. Запушь на сервер.

d2 ()
Ответ на: комментарий от mashinapetro

а если ты сделаешь откат и перепишешь историю - у ВСЕХ будут трудности при fetch/pull

Pinkbyte ★★★★★ ()

Никого не слушай, прочитай про fixup.

Делать reset на удаленной ветке - моветон, лучше сразу удуши себя.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.