git: ветви, которые не похожи на ветви - PullRequest
0 голосов
/ 06 ноября 2018

Я никогда не разбирался в git, и я работаю только над программированием, поэтому я забываю статус своих проектов. На данный момент я не понимаю, что Git говорит мне о старых ветках.

git branch -a говорит:

  dashboard
* master
  php7
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/php7

Так что у меня есть две ветви, кроме master: dashboard и php7. Я четко помню php7 - это был большой кусок работы со многими коммитами. Я не помню dashboard, но название говорит мне, с каким файлом это было связано.

git branch --merged говорит:

  dashboard
* master
  php7

Так что, очевидно, оба слиты. Но php7 известен удаленно, а dashboard нет. Я не помню, какие команды git я делал, чтобы добраться до этой точки.

Когда я смотрю на журнал в PHPStorm (или с git log --graph), эти два не выглядят так, как я ожидал бы, что ветвь будет выглядеть - нет перенаправленной линии с коммитами на ней. Вот самый последний раздел журнала: enter image description here

Тайны (по крайней мере, мне):

  • коммиты, которые я помню, выполняли на ветке php7 все те же оранжевые линии, что и master. Если я слил, а затем удалил ветвь (логическую), почему она по-прежнему отображается как ветка вообще?
  • Почему на последней ветке php7 есть дополнительная метка "origin"? Я бы подумал, что недавние нажатия заставили бы remote выглядеть так же, как локальный, с только одной меткой «origin» на последнем коммите. Конечно, удаленный не считает php7 еще не объединенным - это было бы ужасно, так как этот код важен.
  • dashboard удаленно не известен (https://github.com/OsakaWebbie/kizunadb) - как это может быть?

С другой стороны, ранее в журнале была очень очевидная ветка, которая имела два коммита, а затем была объединена, чего нет в списке ветвей: enter image description here Я был бы счастлив удалить его (я не храню старые ветки для ностальгии), но git branch -d texlabels говорит: error: branch 'texlabels' not found. Самая ветвистая вещь в журнале - это не ветка? У меня болит голова.

Я уверен, что вы, мерзавцы-гуру, сразу узнаете, что все это значит и как их очистить - я с нетерпением жду ясности.

Обновление:

Спасибо Кате за подробный ответ (очень вероятно, будет принят). Но у меня есть несколько последующих вопросов, которые было бы трудно прочитать в крошечном комментарии (я хотел бы, чтобы комментарии могли быть длиннее и иметь больше форматирования), так что терпите меня немного дольше. Я полагаю, что на них может ответить либо комментарий, либо добавление Ката к его ответу - что бы ни работало.

Потому что не уверен, что в прошлом php7 был объединен с мастером.

Если не уверен, что php7 был объединен, почему он указан в --merged? (Мысль о том, что git «не уверен» ни в чем, беспокоит меня ...) Я понятия не имею, как позже переместить голову ветви, поэтому такой сценарий маловероятен. Однако было время, когда я делал что-то локально, что заставляло Github отказываться от push-уведомлений (я думаю, что я мог изменить файлы для уже выдвинутого коммита) - кто-то другой помог мне просмотреть его, и я в итоге выполнил push -f ( Я единственный разработчик). Возможно, это вызвало смещение указателя ...

В любом случае, я знаю, код php7 является частью моей текущей кодовой базы, потому что теперь он успешно работает на PHP7. И я признаю, что некоторые из коммитов были сделаны в этой ветви. На самом деле, вполне возможно, что все коммиты с того момента, как я создал php7, пока я не объединил его (46 коммитов) были сделаны в этой ветви (то есть, не было возврата к мастеру, чтобы исправить ошибки за это время) , Объяснит ли это, почему в группе DAG нет дополнительной строки, кроме главной линии?

Если это так, то, возможно, texlabels - единственная ветвь, которую я когда-либо прерывал, чтобы исправить ошибку на master, так как это единственная дополнительная строка в DAG. Кроме того, ни в одной другой ветви нет записи для «ветви слияния« такой-то и такой-то »» - потому что без каких-либо мастер-фиксаций слиянию не нужно изменять какой-либо контент (просто перемещать указатели)?

Поскольку dashboard был создан локально и никогда не передавался на удаленное устройство.

О, я не осознавал, что основной толчок не включает информацию о ветвях. Очевидно, Github знает о php7, потому что я, без сомнения, делал толчки, пока он был проверен. (Это верно?)

Я также теперь узнал о тегах и создал тег в тот момент, когда развернул свой проект на новом сервере с PHP7 и другими отличиями. Я был бы счастлив, чтобы больше не было ветвей php7 или dashboard, пока моя текущая кодовая база остается моей текущей кодовой базой. Но если вы говорите, что существует некоторая неопределенность относительно их статуса слияния, безопасно ли их удалить? (Удаление вещей звучит страшно, но если это просто указатель ...)

Обновление № 2:

После того, как Ката упомянул, что без --all я мог бы не видеть всего, я сделал разницу между с / без этого флага. Я обнаружил, что в самом начале моей php7 работы были повторены первые четыре коммита, сначала на «ветвистой» ветке (только в --all), а затем на главной линии со всем остальным. Вот соответствующий фрагмент из git log --graph --decorate --all --oneline:

* 3b1c25a Removal of .html files (won't work with the new server config) and $client in db connect file
* dccc3f3 minor edits
* 20a1aab remove .idea files from repo
* 629d891 Second day of cleanup for PHP7: various things, hacking away at errors one at a time (note: I
* a669fa0 First day of cleanup for PHP7:   * mysql_ to mysqli_ (major functions, anyway)   * convert my
| * 51738d1 (refs/original/refs/heads/php7) minor edits
| * f1aa0f9 remove .idea files from repo
| * 38aef9b (refs/original/refs/remotes/origin/php7) Second day of cleanup for PHP7: various things, ha
| * cfcaa51 First day of cleanup for PHP7:   * mysql_ to mysqli_ (major functions, anyway)   * convert
|/
* 294ef21 Feature: batch category delete

Я предполагаю, что странность была как-то вызвана тем, что я случайно использовал командную строку на моей виртуальной машине для выполнения двух из четырех ("удалить .idea ..." и "незначительные правки") вместо OsakaWebbie, как и остальные из них. (Пользователь не показывает в --oneline, но вы можете видеть это на Github.) Но независимо от того, как это произошло, я предполагаю, что первый набор (cfcaa51 - 51738d1) пропадет, когда я удаляю ветку, но поскольку они повторяются (и я знаю, что моя текущая кодовая база отражает изменения в этих коммитах), все должно быть в порядке, верно?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы лучше думаете, ветви как головы (или указатели). 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. Если вы уверены в том, что удаляете, продолжайте.


Еще несколько заметок:

  1. push -f здесь не имеет отношения, оно вызывает неожиданные вещи на удаленном устройстве (например, потеря некоторых коммитов ), а не на локальном.
  2. По умолчанию 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 "основными" коммитами.

...