есть ли возможность отменить фиксацию в интерактивной перебазировке?

Наш ветвящийся конвейер git

dev -> test -> uat -> master

где test, uat и master — защищенные ветки.

У меня есть несколько ошибочных слияний, сделанных до UAT. Я хотел бы вернуть их. Я попытался использовать rebase вместо revert, потому что мне не удалось найти n в HEAD~{n} uptil, с помощью которого я могу отменить все свои коммиты и слияния.

git revert HEAD~n

Поэтому я попытался вместо этого сделать ребас. Я нашел хороший коммит на разработку, до которого все было нормально. я использовал

git rebase -i good_commit_sha

Я вижу список всех коммитов (в основном плохих), бросаю их все и выбираю 2 хороших. Но когда я вижу запрос на слияние, я вижу только те, которые я выбрал (естественно). Так что я понял, что вместо падения я хотел вернуться. Это возможно?

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


person technazi    schedule 17.09.2020    source источник
comment
Я чувствую, что это XY-сценарий.   -  person Daemon Painter    schedule 18.09.2020


Ответы (3)


У меня есть несколько ошибочных слияний, сделанных до UAT. Я хотел бы вернуть их. Я попытался использовать rebase вместо revert, потому что мне не удалось найти n в HEAD~{n} uptil, с помощью которого я могу отменить все свои коммиты и слияния.

git revert HEAD~n

Это ваша актуальная проблема, и мы постараемся найти для нее решение.

Чтобы выполнить git revert после слияния, вам нужно указать несколько параметров, как указано в docs и как объяснено в этом ответе. Вам нужно будет указать сторону слияния, к которой нужно вернуться, иначе утверждение будет неоднозначным. Это руководство от Линуса сам будет полезен.

Ваш синтаксис должен быть следующим:

git revert -m 1 <SHA of the commit to revert to>

помните, -m начинает отсчет с 1, возможно, вы захотите сделать несколько прогонов локально, затем зафиксировать и отправить хороший.

person Daemon Painter    schedule 18.09.2020

Хорошая фраза для запоминания: Rebase locally, merge remotely

Это означает, что пока он еще не запущен, не стесняйтесь использовать (интерактивную) перебазировку и исправлять все, что вам нужно. Это может включать удаление коммитов, их раздавливание, все, что помогает понять вашу историю коммитов.

Как только он будет отправлен, вы должны использовать merge, потому что в противном случае вам придется принудительно отправлять ваши перебазированные изменения позже, чего вам всегда следует избегать, потому что кто-то уже мог проверить, что вы собираетесь изменить (здесь речь идет об истории коммитов).

При этом ваш способ сделать это - одна из возможностей. Вернуть ошибочный коммит позже — это другой путь.
Если вы ожидаете, что ошибочный коммит уже находится на вашем удаленном компьютере, следует отдать предпочтение последнему подходу.

person Dominic Frei    schedule 18.09.2020
comment
так как ошибочные слияния были выполнены до сих пор, изменения были отправлены удаленно в защищенную ветку. - person Daemon Painter; 18.09.2020
comment
Спасибо, что указали на это, @DaemonPainter. Должно быть, я проглядел protected. :) - person Dominic Frei; 18.09.2020

Мне удалось найти ответ на другой этот вопрос на SO. (Найти ссылку)

git reset --hard good_ocmmit_sha

HEAD сейчас находится на стадии исправления модульных тестов good_ocmmit_sha.

git reset --soft @{1}

git commit -m "Reverted to stable"

[revert_branch] Вернулся к стабильной версии

person technazi    schedule 18.09.2020
comment
теперь это XYZ: я хочу вернуться (создать новую фиксацию), я не знаю, как это сделать, поэтому вместо этого я перебазирую (создам новую историю коммитов и удалю некоторые), но это не работает, поэтому вместо этого я сделаю сброс git (мне придется принудительно нажать, уничтожив историю и создав новую) - person Daemon Painter; 18.09.2020
comment
Спасибо за знакомство с этими понятиями. Спасибо за ответ выше. Я буду использовать это вместо этого. Я воздержусь от таких нагруженных вопросов. Хотя мне не нужно было толкать силой, я сделал это тоже неправильно? - person technazi; 18.09.2020
comment
не извиняйтесь, вы правильно сделали, что спросили, это очень поможет вам далеко за пределами реальной технической проблемы. - person Daemon Painter; 18.09.2020