Перемотка назад к предварительному фиксации
Как юниор git пользователь, я был ошеломлен жестким слиянием и, должно быть, сделал что-то не так. Я закончил тем, что разрешил свои разрешения конфликтов с полным беспорядком мусора внутри моих исходных файлов. Конец показывает добавление многих строк, которые выглядят как <<<<<<< HEAD
и >>>>>>> a7b4de79431c2e73d28621c72c8d14820df1a24b
. Конец был перенесен в отдаленное происхождение, так что, к сожалению, я не могу просто скомпенсировать фиксацию.
Я хочу перемотать удаленный репозиторий на последний хороший коммит, 4a3ba7b0e56cf0be80274c1f879029220a889bde
и (если возможно) уничтожить bad commit d004651972cbc35f70ee5a2145b6e03169c77279
.
Я пробовал:
git checkout 4a3ba7
git push -f
и получил: fatal: You are not currently on a branch.
Ответы
Ответ 1
checkout
переносит текущую рабочую директорию на предыдущую фиксацию, но не изменяет содержимое ветки. Вам нужно reset вернуть ветку к старой фиксации, а затем нажать на нее.
git checkout ...
git reset --hard 4a3ba7
git push -f
который сказал, что если вы уже push -f
меняете только самую последнюю фиксацию, вы должны иметь возможность использовать --amend
.
git checkout ...
// Fix the file
git commit --amend
git push -f
Если есть по крайней мере некоторые изменения, которые вы хотите совершить после 4a3ba7
, вы также можете сделать это:
git checkout ...
git reset 4a3ba7
git add -p
// Use the interactive prompt to choose the parts you want
git commit
git push -f
Update
Ваша ошибка remote: error: denying non-fast-forward refs/heads/master
заключается в том, что сервер git, который вы используете, Assembla, не позволяет переписывать историю по умолчанию. См. Этот ответ для исправления этой части: Отменить git нажать на Assembla
Ответ 2
Вам не нужно проверять вещи локально, чтобы перематывать удаленную ветвь; вы можете просто использовать
git push -f origin 4a3ba7b0:master
Конечно, дважды проверьте свои журналы перед тем, как что-либо сделать, поскольку этот push будет перезаписывать удаленные данные.
Если вы получаете ошибки разрешения, receive.denyNonFastForwards
может быть установлен в true
в удаленном репозитории; вы должны изменить это для перемотки, чтобы работать в любом случае.
Ответ 3
Вы можете сделать
git reset --hard *commithash*
но будьте осторожны: это может привести к потере модифицированных данных! (Вас предупредили:))