Я сделал merge request
для своей ветки develop
на gitlab. Потом я понимаю, что совершил огромную ошибку. Я быстро нажал кнопку revert
и подумал, что все в порядке, но это не так. Gitlab сделал только revert
фиксации. В логах еще есть коммиты из исходной ветки. Это вызывает много проблем с версией. Есть ли какое-либо решение для отмены единого запроса на слияние на платформе gitlab и очистки журналов ветвей от многих нежелательных коммитов. Я бы хотел, чтобы моя ветка была такой, как если бы у этого мерж-реквеста никогда не было места.
Как отменить мерж-реквест с его коммитами?
- Вы должны прочитать о различиях между git revert и git reset< /а>. 12.12.2018
Ответы:
Сначала создайте новую ветку keepsafe
, чтобы все эти изменения остались где-то на случай, если вы накосячите. Это «скопирует» текущее состояние локально и также сохранит его на удаленном компьютере.
git checkout -b keepsafe
git push
Теперь вернитесь к разработке. X
— это количество коммитов, которые вы хотите удалить.
git checkout develop
git reset --hard HEAD~X
git push -f
Локальная разработка будет жестко сброшена до исходного коммита. git push -f
перезапишет удаленную ветку. Все коммиты исчезнут.
Обратите внимание, что GitLab позволяет администратору отключать принудительную отправку (git push -f), поэтому, если это не сработает, вам нужно поговорить с администратором. Но тогда вы, вероятно, должны сделать это в любом случае.
Вы можете вернуться к предыдущей фиксации, используя интерактивную перезагрузку. Предполагая, что вы хотите вернуть HEAD к HEAD~5 (5 коммитов ранее), вы можете выбрать родителя HEAD~5, т.е. HEAD~6, и просто применить HEAD~5 поверх него.
git rebase -i HEAD~6
Каждая фиксация между HEAD~6 и HEAD будет перезаписана. Скажем, HEAD~5 SHA1 — это ABC, а HEAD~6 SHA1 — это XYZ. Текущий HEAD — PQR. Нам нужно удалить другие коммиты из приведенного ниже редактирования, так как мы не хотим переписывать их в HEAD~6. Мы просто хотим применить HEAD~5 поверх HEAD~6. У нас должна быть хотя бы одна запись в этом файле, иначе ребазирование прервется. Итак, мы применяем HEAD~5 поверх HEAD~6.
edit ABC reverting to state before merge
# Rebase XYZ..PQR onto XYZ
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Теперь введите приведенную ниже команду, чтобы изменить историю и ввести сообщение фиксации.
git commit --amend
Теперь введите команду ниже, чтобы продолжить и выйти из редактора.
git commit --continue
Подробнее об переписывании истории git