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.