Как полностью игнорировать нажатые коммиты и слияние с основной веткой?

После отправки некоторых коммитов в ветку dev и их слияния с веткой master. Я хочу вернуться к 4 коммитам назад. Я могу сделать это, используя git reset --hard <hash-id> (который hash-id является 4-м предыдущим коммитом)

но когда я хочу снова отправить его в ветку dev, он говорит: «Сначала сделайте git pull», потому что изменения новостей выходят из удаленной ветки dev.

Чтобы решить проблему, я запускаю следующие команды:

git reset --hard <hash-id>
git clean -d -f
git push -f origin dev

Теперь мне нужна ветка dev, но когда я хочу объединить ее с веткой master, она говорит: «Изменений не найдено».

Очень странно, потому что в ветке dev и master кодовая база разная, но там написано, что изменений не обнаружено. Как я могу создать ветку dev и мастерить один и тот же контент?

Обновляется ли ваш местный master филиал? Попробуйте сначала запустить git checkout master; git pull, а затем повторите попытку слияния.

larsks 10.04.2023 16:48

Я думаю, что формулировка слияния «с» сбивает с толку. Я полагаю, что комментарий @larsks интерпретирует «слияние с» как слияние master с dev, хотя я думаю, что вы имеете в виду здесь то, что вы сливаетесь dev с master. Лучше говорить «в», а не «с», чтобы было очевидно, какая ветка является исходной, а какая целевой для слияния.

TTT 10.04.2023 20:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Причина, по которой вы видите «изменения не найдены» при слиянии dev с master, заключается в том, что Git просматривает идентификаторы коммитов, чтобы увидеть, какие идентификаторы коммитов включены dev, а какие нет master. Независимо от того, сбрасываете ли вы dev на 1 коммит или на 100 коммитов, вы все равно получите одно и то же сообщение, потому что в dev нет новых коммитов, которых еще нет в master.

Боковое примечание: альтернативный способ «отменить» эти 4 коммита вместо сброса назад, как вы сделали, — это использовать revert. Если слияние dev с master создало фиксацию слияния на master, то вы можете просто отменить эту фиксацию слияния на master, и это отменит изменения, внесенные этими 4 фиксациями. Необходимость сброса или возврата обычно зависит от того, является ли ветка общей или нет. Если другие люди используют ветку master, то сброс и принудительное нажатие могут их испортить, поэтому предпочтительнее вернуться.

Другое примечание: вы также упомянули:

Как я могу создать ветку dev и мастерить один и тот же контент?

Выполнение упомянутых выше действий позволит достичь вашей цели, однако, если под «одинаковым содержимым» вы также подразумеваете, что dev и master должны указывать на один и тот же коммит, тогда ваша команда сброса master может быть просто:

git switch master # checkout master
git reset --hard dev # point master to what dev is pointing to
git push --force-with-lease # this is safer than just --force

Я устал от вашего решения, почти все прошло хорошо, но на последнем шаге (нажатие на ветку main) я получил эту ошибку из-за защищенной ветки i.stack.imgur.com/S9Jkp.jpg .. любой идея?

Martin AJ 11.04.2023 15:31

@MartinAJ Это имеет смысл. Как я упоминал в примечании, переписывание общих веток может запутать других людей, поэтому рекомендуется предотвратить принудительное нажатие общих веток. В этом случае вы можете вернуться вместо сброса, или получить временное разрешение на принудительную отправку от администратора, или попросить администратора выполнить сброс и принудительно отправить его. Кроме того, обычно, когда вы принудительно отправляете общую ветку, вы хотите, чтобы все знали, если они уже начали работу на основе удаляемых вами коммитов.

TTT 11.04.2023 16:20

Другие вопросы по теме