Вы лучше думаете, ветви как головы (или указатели). git log
показывает вам DAG коммитов и список глав, указывающих на конкретные коммиты. То, что вы видите в настоящий момент, выглядит примерно так: голова php7
указывает на этот коммит. В прошлом вы не могли знать, как двигалась голова php7
, поскольку git
позволяет нам свободно перемещать головы.
Относительно git branch --merged [<commit>]
, посмотрите в документ , команда просто показывает все головы, которые могут быть достигнуты из <commit>
. В вашем случае <commit>
- это HEAD
, что означает master
. Таким образом, результат очевиден: dashboard
, master
и php7
достижимы с HEAD
. Обратите внимание, что по умолчанию git branch
не показывает удаленные головки, добавьте параметр -a
для этого .
Теперь я думаю, что на ваши вопросы можно ответить.
Коммиты, которые я помню, выполняли в ветке php7 все те же оранжевые линии, что и master. Если я слил, а затем удалил ветвь (логическую), почему она все еще отображается как ветка вообще?
Потому что не уверен, что в прошлом php7
был объединен в master
. Даже если бы это было так, всегда может быть, что в какой-то момент позже php7
голова была перемещена, поэтому мы не можем видеть след слияния, вызванного php7
.
Почему на последней ветке php7 есть дополнительная метка "origin"? Я бы подумал, что недавние нажатия заставили бы remote выглядеть так же, как локальный, с только одной меткой «origin» на последнем коммите. Конечно, удаленный не считает php7 еще не объединенным - это было бы ужасно, так как этот код важен.
Этот ярлык просто означает, что в настоящее время есть 2 головы - php7
и origin/php7
- указывающие на этот коммит.
Панель управления удаленно не известна (https://github.com/OsakaWebbie/kizunadb) - как это может быть?
Поскольку dashboard
был создан локально и никогда не передавался удаленно.
Я был бы рад удалить его (я не сохраняю старые ветки для ностальгии), но git branch -d texlabels говорит: error: ветка 'texlabels' не найдена. Самая ветвистая вещь в журнале - это не ветка? У меня болит голова.
Вы знаете существующий заголовок texlabels
только потому, что видите его имя в сообщении фиксации. Но на самом деле эта голова была удалена в прошлом, поэтому в настоящее время вы не можете удалить ее снова.
Обновление:
Чтобы ответить еще на некоторые вопросы о @ OsakaWebbie
Параметр --merged
назван исходя из того факта, что в нормальное развитие (т. Е. Вы ненормально не двигаете головами, например git reset
), если головка child
может достигать головы parent
, это означает, что parent
был объединен с child
в некоторый момент в прошлом. Другими словами, child
наследует parent
.
----------------------- child
/
/
parent
Но я сопереживаю вам по этому поводу, на самом деле есть жалоб по поводу имен git
команд и их параметров.
Возвращаясь к истории вашей php7
головы, я думаю, что ситуация должна проясниться.
Слияние не обязательно приводит к объединению двух путей в один. Действительно, как вы сказали, поскольку вы переключились на php7
и добавили к нему 46 коммитов, вы не добавили коммит к master
, поэтому история до слияния выглядит следующим образом:
----------------- master
\
----------------- php7
Затем вы вернулись к master
и произвели слияние: git merge php7
. Поскольку php7
является потомком master
, результат слияния должен быть точно php7
. Таким образом, git
просто переместит master
вперед и укажет на коммит, на который указывает php7
. Этот вид слияния называется fast-forward . Тогда у вас есть:
-------------------
\
----------------- php7, master
что по сути является:
-------------------------------------- php7, master
Но перемотка вперед не произошла при слиянии texlabels
головы. Вы создали голову, переключились на нее, что-то закодировали и добавили некоторые коммиты. Затем вы переключились обратно на master
, также что-то закодировали и добавили некоторые коммиты. Итак, у вас есть:
----------------- master
\
----------- texlabels
Как видите texlabels
не является ребенком master
. Следовательно, это не может быть перемотка вперед, объединение texlabels
в master
приведет к:
----------------- (old master) -- master
\ /
----------- texlabels
Вот почему это единственная ветвистая вещь в истории.
Относительно ваших двух последних проблем:
О, я не осознавал, что основной толчок не включает информацию о ветвях. Очевидно, Github знает о php7, потому что я, без сомнения, делал нажатия, пока он был проверен. (Это верно?)
git push <remote> [<head>]
только выдвигает предоставленное <head>
(и его предок, конечно, фиксирует). Если <head>
не указано, то будет использоваться головка, на которую указывает HEAD
- в вашем случае это php7
. Чтобы сдвинуть все головы, используйте опцию --all
.
Но если вы говорите, что существует некоторая неопределенность относительно их статуса слияния, безопасно ли их удалять? (Удаление вещей звучит страшно, но если это просто указатель ...)
Да, головы - это просто указатели, но, пожалуйста, будьте осторожны: после удаления головы некоторые коммиты могут быть оставлены - то есть они не могут быть достигнуты из любой головы - и будут очищены (удалены) с помощью GC
git
. Если вы уверены в том, что удаляете, продолжайте.
Еще несколько заметок:
-
push -f
здесь не имеет отношения, оно вызывает неожиданные вещи на удаленном устройстве (например, потеря некоторых коммитов ), а не на локальном.
- По умолчанию
git log
показывает только те коммиты, которые могут быть достигнуты с HEAD
, используйте опцию --all
, чтобы показать все коммиты.
Обновление № 2:
О 4 дополнительных коммитах
Весьма вероятно, что при коммите 51738d1 minor edits
вы ввели команду git filter-branch
, чтобы массово изменить что-то в этих 4 коммитах (я думаю, что нужно изменить имена авторов). Затем было создано 4 новых коммита (от a669fa0 до 3b1c25a). 4 старых коммита (от cfcaa51 до 51738d1) все еще там, потому что они все еще достижимы из голов refs/original/...
. Эти головки были созданы механизмом поддержки git filter-branch
.
Вы полностью можете удалить эти 4 дополнительных коммита . Они совершенно не связаны с 4 "основными" коммитами.