Git и "ветвь 'x' не полностью объединена" Ошибка - PullRequest
253 голосов
/ 26 сентября 2011

Вот команды, которые я использовал из основной ветки

git branch experiment
git checkout experiment

Затем я внес некоторые изменения в свои файлы, зафиксировал их и перенес новую ветку в GitHub.

git commit .
git push -u origin experiment

Обратите внимание, что после git 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, и я не знаю, насколько больше я мог бы объединить две ветви. Что мне здесь не хватает?

Ответы [ 9 ]

274 голосов
/ 26 сентября 2011

Примечание Формулировка изменена в ответ на комментарии.Спасибо @slekse Это не ошибка, это предупреждение.Это означает, что ветвь, которую вы собираетесь удалить, содержит коммиты, которые недоступны ни из одного из: его восходящей ветки или HEAD (текущая проверенная ревизия). Другими словами, когда вы можете потерять коммиты.

На практике это означает, что вы, вероятно, исправили, перебазировали или отфильтровали коммиты, и они не кажутся идентичными.

Поэтому вы могли бы избежать предупреждения , проверив ветвь, содержащую коммиты, о которых вы говорите без ссылки , удалив эту другую ветку .²

Вы хотите убедиться, что вы на самом деле не пропускаете какие-либо важные коммиты:

git log --graph --left-right --cherry-pick --oneline master...experiment

Это даст вам список всех неразделяемых между ветвями.Если вам любопытно, может быть разница без --cherry-pick, и эта разница вполне может послужить причиной получения предупреждения:

--cherry-pick

Пропустить любой коммитэто вносит то же изменение, что и другой коммит на «другой стороне», когда набор коммитов ограничен симметричной разностью.Например, если у вас есть две ветви, A и B, обычным способом перечисления всех коммитов только на одной их стороне является --left-right, как в примере выше в описании этой опции.Однако он показывает коммиты, которые были выбраны вишней из другой ветви (например, «3-е на b» может быть выбрано вишней из ветви A).С помощью этой опции такие пары коммитов исключаются из выходных данных.


really по умолчанию они на самом деле только мусор, собираемый через некоторое время.Кроме того, команда git-branch не проверяет дерево редакций все ветви .Это предупреждение, чтобы избежать очевидных ошибок.

² (здесь я предпочитаю просто принудительно удалить, но вам может потребоваться дополнительная уверенность).

73 голосов
/ 02 апреля 2012

Как отметил Дрю Тейлор, при удалении ветви с -d учитывается только текущий HEAD при определении, является ли ветвь полностью объединенной. Он будет жаловаться, даже если ветвь будет объединена с какой-либо другой веткой. Сообщение об ошибке определенно может быть яснее в этом отношении ... Вы можете извлекать объединенную ветку перед удалением или просто использовать git branch -D. Заглавная -D полностью отменяет проверку.

13 голосов
/ 18 сентября 2013

Я попытался ответить Сехе, но он не сработал.

Чтобы найти коммиты, которые не были объединены, просто используйте:

git log feature-branch ^master --no-merges
13 голосов
/ 22 февраля 2012

Сегодня со мной произошло это, когда я сливал свою самую первую ветвь функций обратно в мастер. Как некоторые говорили в потоке где-то в SO, трюк снова переключался на master, прежде чем пытаться удалить ветку. Вернувшись в master, git был рад удалить ветку без предупреждений.

4 голосов
/ 11 декабря 2014

Git предупреждает, что вы можете потерять историю, удалив эту ветку. Даже при том, что это фактически не удаляло бы любые коммиты сразу, некоторые или все коммиты в ветке стали бы недоступными, если они также не являются частью какой-либо другой ветки.

Для того, чтобы ветвь experiment была «полностью объединена» с другой ветвью, ее коммит должен быть предком кончика другой ветки, что делает коммиты в experiment подмножеством другой ветки. Это позволяет безопасно удалить experiment, поскольку все его коммиты останутся частью истории репозитория через другую ветку. Он должен быть «полностью» объединен, потому что он мог быть объединен уже несколько раз, но теперь после последнего слияния были добавлены коммиты, которые не содержатся в другой ветви.

Git, однако, не проверяет каждую другую ветку в хранилище; всего два:

  1. Текущая ветка (HEAD)
  2. Восходящая ветвь, если она есть

«Восходящая ветвь» для 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 подтвердить полностью объединенный статус для вас.

3 голосов
/ 21 мая 2014

чтобы увидеть изменения, которые не были объединены, я сделал это:

git checkout experiment
git merge --no-commit master

git diff --cached

Примечание: это показывает изменения в master, которых нет в experiment.

Не забудьте:

git merge --abort

Когда вы закончите, посмотрите.

2 голосов
/ 14 января 2018

Самое простое решение с объяснением (дважды проверенное решение) (сталкивался с проблемой раньше)

Проблема:

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 или что-то еще) из ветви,

, что я сделал в своем коде, это то, что я переключился на мастер, а затем объединитьветвь в нее (чтобы убедиться, что они идентичны на вашем локальном компьютере), затем я снова переключился на ветку и отправил обновления или изменения в удаленное онлайн-репозиторий, используя «git push».

после этогоЯ переключился на тон снова освоил и попытался удалить ветку, и проблема (предупреждающее сообщение) исчезла, а ветка удалась успешно

2 голосов
/ 26 марта 2014

Вы можете просто выяснить:

git log --cherry master ... экспериментальная

--cherry опция является синонимом для --right-only --cherry-mark --no-merges

Страница справочника git-log сказала

Полезно ограничить вывод коммитами на нашей стороне и отметить те, которые были применены к другой стороне разветвленной истории, с помощью git log --cherry upstream ... mybranch, аналогично git cherry upstream mybranch.

FYI. --cherry-pick пропускает эквивалентные коммиты, но --cherry-marks не делает. Полезно найти ребаз и форсировать обновленные изменения между открытой и совместной публичной веткой

1 голос
/ 31 октября 2016

У меня не было ветки upstream в моем локальном git. Я создал локальную ветку от master, git checkout -b mybranch. Я создал ветку с графическим интерфейсом bitbucket в исходном git и перенес мою локальную ветвь (mybranch) в эту ветвь. После того, как я сделал git fetch для своего локального git, чтобы получить ветку upstream, я мог сделать git branch -d mybranch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...