Сегодня утром мы вытаскиваем из нашего репо, а git ставим нас (нет ветки).
Я не понимаю этого, почему это произошло? И как выйти из этого без потери наших изменений?
Сегодня утром мы вытаскиваем из нашего репо, а git ставим нас (нет ветки).
Я не понимаю этого, почему это произошло? И как выйти из этого без потери наших изменений?
"В настоящее время нет ни одной ветки" означает, что у вас есть detached head, то есть ваш указатель HEAD напрямую ссылается на фиксацию вместо символического указания имени ветки.
Вы можете попасть в эту ситуацию, проверив фиксацию SHA1, или когда вы находитесь в середине переадресации или когда слияние сбой. Трудно сказать, что вы, возможно, сделали, чтобы случайно попасть в эту ситуацию.
Сказано, что вы можете потерять свои изменения, когда вы переключаетесь с отдельной главы на какую-либо ветку, но рефлок всегда будет отслеживать, где движется ваш ГОЛОВА. Фактически, Git 1.7.5 предупреждает вас при переключении с отсоединенного HEAD, потеряет фиксации. Единственный раз, когда вы можете действительно потерять работу, - это когда у вас есть незафиксированные изменения, которые вы, возможно, захотите зафиксировать или заблокировать.
Простой способ узнать, что произошло, это git reflog
или git log -g --decorate
для более подробного перечисления. Опция --decorate
будет обозначать каждый SHA1 именами всех ветвей, которые указывают на нее. Если SHA1 вашей текущей HEAD точно такой же, как у мастера, тогда вам не нужно ничего делать, кроме git checkout master
, чтобы вернуться в нужное русло. В противном случае см., Если на SHA1 указана другая ветвь. Если нет, возможно, вы захотите создать ветку, чтобы она зависала.
Еще одна хорошая команда - git branch -av
, которая также будет перечислять все ветки и то, на что они указывают, чтобы вы могли видеть, что действительно должно быть вашим (no branch)
.
Трудно сказать без каких-либо подробностей.
git pull
извлекает изменения из удаленного репозитория, а затем выполняет слияние. Он может быть настроен на выполнение переадресации вместо слияния (либо с помощью git pull --rebase
, либо путем настройки истинного значения для branch.<branch_name>.rebase
для ветки, в которую вы тянете).
Если вы начали на ветке, любое притяжение типа merge всегда оставит вас на этой ветке. С другой стороны, команда rebase всегда работает, используя временно отсоединенную HEAD (иначе называемую "ветвь" ). Если вы были оставлены в этом состоянии во время притяжения типа rebase-типа, то это связано с тем, что часть перетаскивания при столкновении столкнулась с конфликтами и ожидает, что вы их разрешите и используйте rebase --continue
(или --skip
или --abort
).
По умолчанию reflog хранит каждое обновление, которое делается для HEAD (также может быть один для каждой ветки). Вы можете просмотреть reflog с помощью git reflog show
(или git log -g
для более подробного представления). Это может помочь вам определить, как вы попали в это состояние.
Если вы находитесь в середине rebase (у вас есть каталог .git/rebase-apply
), тогда он, вероятно, остановился, чтобы разрешить некоторые конфликты (конфликты). Используйте git status
для проверки "несвязанных" записей. Любые такие записи должны иметь маркеры конфликтов, встроенные в файлы (при условии, что они представляют собой текстовые файлы). Вы должны отредактировать их для разрешения конфликта (ов), и они помечают их как объединенные, запустив git add
на них. Затем запустите git rebase --continue
, чтобы продолжить переустановку. Вы можете столкнуться с большим количеством конфликтов, которые должны обрабатываться аналогичным образом (редактировать, добавлять, продолжать). Если вы решите, что вам больше не нужна конкретная фиксация, вы можете пропустить ее с помощью git rebase --skip
. Вы можете прервать всю переадресацию с помощью git rebase --abort
. Все эти команды переадресации перечислены в сообщении об ошибке, когда rebase прекращается из-за конфликта. После того, как все ожидающие коммиты были применены (или пропущены), ваш исходный филиал будет обновлен с последним новым фиксатором, и ваш HEAD будет привязан к нему (если вы прервете, ваш HEAD будет повторно подключен без обновления ветки).
Если ваш отсоединенный 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
, чтобы снова подключить HEAD вашего хранилища к ветке.
Обратите внимание, что в случае выполнения "git pull --rebase
" при отключении HEAD
, Git попытался найти ветвь восходящего потока отсоединенного HEAD
(которая по определению не существует) и испускается ненужным сообщения об ошибках.
Это уже не так с Git1.8.0.1 (26 ноября 2012 г.)
См. это коммит.