После отправки некоторых коммитов в ветку 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 и мастерить один и тот же контент?
Я думаю, что формулировка слияния «с» сбивает с толку. Я полагаю, что комментарий @larsks интерпретирует «слияние с» как слияние master
с dev
, хотя я думаю, что вы имеете в виду здесь то, что вы сливаетесь dev
с master
. Лучше говорить «в», а не «с», чтобы было очевидно, какая ветка является исходной, а какая целевой для слияния.
Это происходит потому, что вы не можете удалить коммиты с помощью слияния, а те 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 .. любой идея?
@MartinAJ Это имеет смысл. Как я упоминал в примечании, переписывание общих веток может запутать других людей, поэтому рекомендуется предотвратить принудительное нажатие общих веток. В этом случае вы можете вернуться вместо сброса, или получить временное разрешение на принудительную отправку от администратора, или попросить администратора выполнить сброс и принудительно отправить его. Кроме того, обычно, когда вы принудительно отправляете общую ветку, вы хотите, чтобы все знали, если они уже начали работу на основе удаляемых вами коммитов.
Обновляется ли ваш местный
master
филиал? Попробуйте сначала запуститьgit checkout master; git pull
, а затем повторите попытку слияния.