Почему Git настроил нас (без ветки)? - PullRequest
74 голосов
/ 23 марта 2010

Этим утром мы вытаскиваем из нашего репо, и Git надевает нас (без ветки).

Я не понимаю этого, почему это произошло?И как выйти из этого, не потеряв наших изменений?

Ответы [ 3 ]

97 голосов
/ 23 марта 2010

«В настоящее время не в какой-либо ветви» означает, что у вас есть отсоединенный head , т.е. ваш указатель HEAD напрямую ссылается на коммит, а не символически указывает на имя ветви.

Вы можете попасть в эту ситуацию, проверив фиксацию по SHA1, или когда вы находитесь в середине перебазирования, или когда сбой слияния.Трудно сказать, что вы, возможно, сделали, чтобы случайно попасть в эту ситуацию.

Говорят, что вы можете потерять свои изменения при переключении с отдельного HEAD на какую-то ветку, но reflog всегда будет отслеживатькуда переместилась ваша ГОЛОВАФактически, Git 1.7.5 предупредит вас, когда переключение с отключенного HEAD потеряет коммиты.Единственный раз, когда вы можете действительно потерять работу, это когда у вас есть незафиксированные изменения, которые вы можете захотеть зафиксировать или спрятать.

Простой способ увидеть, что произошло, это git reflog или git log -g --decorate для более подробного перечисления.Опция --decorate помечает каждый SHA1 именами всех ветвей, которые указывают на него.Если SHA1 вашей текущей HEAD точно такой же, как master, вам не нужно ничего делать, кроме git checkout master, чтобы вернуться на правильный путь.В противном случае, посмотрите, на что указывает SHA1 какой-либо другой ветвью.Если нет, вы можете захотеть создать ветку, которая будет висеть на ней.

Еще одна хорошая команда - git branch -av, которая аналогичным образом выведет список всех ветвей и на что они указывают, так что вы можете увидеть, на что ваша (no branch) действительно должно быть.

32 голосов
/ 23 марта 2010

Трудно сказать без подробностей.

git pull извлекает изменения из удаленного хранилища, а затем выполняет слияние. Его можно настроить на перебазирование вместо слияния (либо с помощью git pull --rebase, либо путем настройки истинного значения для branch.<branch_name>.rebase для ветви, в которую вы входите).

Если вы начали с ветки, любое вытягивание типа слияния всегда будет оставлять вас на этой ветке. С другой стороны, команда rebase всегда работает с использованием временно отключенного HEAD (он же «без ветки»). Если вы были оставлены в этом состоянии во время извлечения типа rebase, то это потому, что в части rebase обнаружены конфликты, и он ожидает, когда вы решите их и используете rebase --continue (или --skip, или --abort ).

По умолчанию в reflog хранятся все обновления, сделанные в HEAD (также может быть по одному для каждой ветви). Вы можете просмотреть reflog с помощью git reflog show (или git log -g для более подробного просмотра). Это может помочь вам определить, как вы попали в это состояние.

Если вы находитесь в середине перебазирования (у вас есть каталог .git/rebase-apply), то он, вероятно, остановился, чтобы позволить вам разрешить некоторые конфликты. Используйте git status, чтобы проверить «не объединенные» записи. Любые такие записи должны иметь встроенные в файлы маркеры конфликта (при условии, что они представляют собой простые текстовые файлы). Вы должны отредактировать их, чтобы разрешить конфликт (ы), и они пометят их как объединенные, запустив на них git add. Затем запустите git rebase --continue, чтобы продолжить перебазирование. Вы можете столкнуться с большим количеством конфликтов, которые должны быть обработаны аналогичным образом (изменить, добавить, продолжить). Если вы решите, что вам больше не нужен конкретный коммит, вы можете пропустить его с помощью git rebase --skip. Вы можете прервать весь ребаз с помощью git rebase --abort. Все эти команды перебазирования перечислены в сообщении об ошибке, когда перебазирование прекращается из-за любого конфликта. Как только все ожидающие коммиты будут применены (или пропущены), ваша исходная ветвь будет обновлена ​​с последним новым коммитом, и ваш HEAD будет присоединен к нему (если вы прерветесь, ваш HEAD будет присоединен без обновления ветки).

Если ваша отсоединенная ГОЛОВКА не вызвана конфликтами, возникшими в середине перебазирования, то ваша ГОЛОВКА была отсоединена в некоторый момент до извлечения. Вам нужно будет оценить текущее состояние дерева, чтобы решить, что вы хотите сделать. Вы можете использовать git show-branch --current --all или git log --graph --oneline --decorate --all или графический инструмент, такой как gitk, чтобы узнать, как ваша текущая (отдельная) HEAD связана с другими вашими ветвями. Если вы решите, что хотите сохранить содержимое вашего заголовка, вы можете создать для него новую ветку с помощью git branch new_branch_name. Если вы хотите перезаписать существующую ветку, используйте git branch --force existing_branch_name. Затем используйте git checkout branch_name, чтобы присоединить ГОЛОВКУ хранилища к ветке.

2 голосов
/ 26 ноября 2012

Обратите внимание, что в случае запуска "git pull --rebase", когда HEAD отсоединен, Git попытался найти восходящую ветвь отсоединенного HEAD (который по определению не существует) и выдал ненужные сообщения об ошибках.

Это больше не относится к Git1.8.0.1 (26 ноября 2012 г.)

См. этот коммит .

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