Перемотка назад к предварительному фиксации

Как юниор 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* 

но будьте осторожны: это может привести к потере модифицированных данных! (Вас предупредили:))