Git и "ветвь" x "не полностью объединена" Ошибка
Вот команды, которые я использовал из главной ветки
git branch experiment
git checkout experiment
Затем я внесла некоторые изменения в мои файлы, зафиксировал изменения и нажал новую ветку на GitHub.
git commit .
git push -u origin experiment
Обратите внимание, что после git commit .
мне было предложено передать сообщение commit, и я его дал. Позже я решил объединить ветвь эксперимента в ведущую ветвь.
git checkout master
git merge experiment
Наконец, я нажал изменения в GitHub.
git push -u origin master
Все прошло хорошо, пока я не попытался удалить ветвь эксперимента с помощью
git branch -d experiment
Я получил сообщение об ошибке error: The branch 'experiment' is not fully merged.
Я немного новичок в git, и я не знаю, сколько еще я мог бы объединить две ветки. Что мне здесь не хватает?
Ответы
Ответ 1
Примечание. Изменение в ответ на коммиты. Спасибо @slekse
Это не ошибка, это предупреждение. Это означает, что ветка, которую вы собираетесь удалить, содержит коммиты, недоступные из любого из следующих: ветка вверх или HEAD (в настоящее время проверена ревизия). Другими словами, когда вы можете потерять коммиты¹.
На практике это означает, что вы, вероятно, исправили, переустановили или отфильтровали, и они не кажутся одинаковыми.
Следовательно, вы можете избежать предупреждения, проверив ветку, которая содержит коммиты, о которых вы ссылаетесь на un-reference, удалив эту другую ветвь.²
Вы хотите убедиться, что на самом деле вы не пропустите никаких важных коммитов:
git log --graph --left-right --cherry-pick --oneline master...experiment
Это даст вам список любых неразделенных между ветвями. Если вам интересно, может быть разница без --cherry-pick
, и эта разница вполне может быть причиной предупреждения, которое вы получаете:
--cherry-pick
Опустить любое коммитирование, которое вводит то же изменение, что и другое совершение на "другой стороне", когда набор коммитов ограничен симметричной разницей. Например, если у вас есть две ветки, A и B, обычный способ перечислить все коммиты только с одной стороны - с -left-right, как в приведенном выше примере описания этого параметра. Тем не менее, он показывает фиксации, которые были выбраны из другой ветки (например, "3-й на b" может быть выбран из вишни из ветки A). С помощью этой опции такие пары коммитов исключаются из вывода.
¹ они по сути только мусор, собранный через некоторое время, по умолчанию. Кроме того, команда git-branch
не проверяет дерево изменений всех ветвей. Предупреждение существует, чтобы избежать очевидных ошибок.
² (Мое предпочтение здесь заключается в том, чтобы просто принудительно удалить удаление, но вы можете захотеть получить дополнительное подтверждение).
Ответ 2
Как отметил Дрю Тейлор, удаление ветки с -d рассматривает только текущий HEAD при определении того, "ветвь" полностью "слита". Он будет жаловаться, даже если ветка будет объединена с какой-либо другой веткой. Сообщение об ошибке может быть яснее в этом отношении...
Вы можете либо проверить объединенную ветвь перед удалением, либо просто использовать git branch -D. Капитал -D полностью переопределит чек.
Ответ 3
У меня это случилось со мной сегодня, так как я объединил свою первую функциональную ветвь в мастер. Как некоторые говорили в нить в другом месте на SO, трюк возвращался к мастеру, прежде чем пытаться удалить ветку. Однажды в мастерстве git был рад удалить ветку без каких-либо предупреждений.
Ответ 4
Я попытался найти ответ, и это не сработало.
Чтобы найти коммиты, которые не были объединены, просто используйте:
git log feature-branch ^master --no-merges
Ответ 5
Git предупреждает, что вы можете потерять историю, удалив эту ветку. Несмотря на то, что на самом деле это не приведет к удалению каких-либо коммитов сразу, некоторые или все коммиты на ветке станут недоступными, если они также не являются частью какой-либо другой ветки.
Чтобы ветвь experiment
была полностью "слита" в другую ветвь, ее накопление подсказки должно быть предком другого ветки ветки, заставляя в experiment
подмножество другой ветки. Это делает безопасным удаление experiment
, так как все его фиксации останутся частью истории хранилища через другую ветку. Он должен быть "полностью" объединен, потому что он, возможно, уже несколько раз слился, но теперь он добавляет его после последнего слияния, которое не содержится в другой ветке.
Git не проверяет каждую другую ветвь в репозитории; всего два:
- Текущая ветвь (HEAD)
- Верхняя ветвь, если есть одна
"Верхняя ветвь" для experiment
, как в вашем случае, вероятно, origin/experiment
. Если experiment
полностью объединено в текущей ветке, то Git удаляет его без жалобы. Если это не так, но он полностью объединен в своей ветки вверх, то Git продолжает предупреждение:
warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).
Где xxxxxxxx
указывает идентификатор фиксации. Полностью объединенный в своем восходящем потоке указывает, что коммиты в experiment
были перенесены в исходный репозиторий, так что даже если вы потеряете их здесь, их можно хотя бы сохранить в другом месте.
Так как Git не проверяет другие ветки, может быть безопасно удалить ветку, потому что вы знаете, что она полностью слита в другую; вы можете сделать это с помощью опции -D
, как указано, или сначала переключиться на эту ветвь, а Git подтвердить полностью объединенный статус для вас.
Ответ 6
чтобы увидеть изменения, которые не объединены, я сделал это:
git checkout experiment
git merge --no-commit master
git diff --cached
Примечание. Это показывает изменения в master
, которые не находятся в experiment
.
Не забывайте:
git merge --abort
Когда вы закончите поиск.
Ответ 7
Вы можете просто выяснить:
git log --cherry мастер... экспериментальный
--cherry
является синонимом для --right-only --cherry-mark --no-merges
сказала страница руководства git-log
Полезно ограничить вывод коммитами на нашей стороне и отметить те, которые были применены к другой стороне раздвоенной истории, с помощью git log --cherry upstream... mybranch, аналогично git cherry upstream mybranch.
FYI. --cherry-pick
пропускает эквивалентные коммиты, но --cherry-marks
не делает. Полезно найти перебазирование и форсировать обновленные изменения между открытой и совместной публичной веткой
Ответ 8
Самое простое решение с объяснением (двойная проверка решения) (сталкивался с проблемой раньше)
Проблема в следующем:
1- Я не могу удалить ветку
2- Терминал продолжает отображать предупреждение о том, что есть некоторые коммиты, которые еще не утверждены
3- зная, что я проверил мастер и ветку, и они идентичны (на текущий момент)
решение:
git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name
Объяснение:
когда ваша ветвь подключена к восходящей удаленной ветке (на Github, bitbucket и т.д.), вам необходимо слить (протолкнуть) ее в мастер, и вам нужно перенести новые изменения (коммиты) в удаленный репозиторий (Github, bitbucket или что угодно) из ветки,
Что я сделал в своем коде, так это то, что я переключился на master, затем слил в него ветку (чтобы убедиться, что они идентичны на вашей локальной машине), затем я снова переключился на ветку и отправил обновления или изменения в удаленный онлайн репо с помощью "git push".
после этого я снова переключился на мастер и попытался удалить ветку, и проблема (предупреждающее сообщение) исчезла, и ветка успешно удалена
Ответ 9
У меня не было ветки upstream на моем локальном git. Я создал локальную ветку от мастера, git checkout -b mybranch. Я создал ветку с графическим интерфейсом bitbucket на восходящем потоке git и нажал мою локальную ветвь (mybranch) на эту ветку вверх по течению. Как только я сделал git fetch на моем локальном git, чтобы извлечь ветвь вверх по течению, я мог бы сделать ветвь git -d mybranch.