Починить отсоединенную голову Гита?
Я делал некоторую работу в моем репозитории и заметил, что файл имел локальные изменения. Я не хотел их больше, поэтому я удалил файл, думая, что могу просто проверить новую копию. Я хотел сделать git эквивалент
svn up .
используя git pull Кажется, не работает. Какой-то случайный поиск привел меня на сайт, где кто-то рекомендовал делать
git checkout HEAD^ src/
(src - это каталог, содержащий удаленные файлы).
теперь я узнаю, что у меня есть отдельный голова. Я понятия не имею, что это. Как я могу отменить?
13 ответов:
отсоединенная головка означает, что вы больше не находитесь на ветке, вы проверили одну фиксацию в истории (в этом случае фиксация предшествует HEAD, т. е. HEAD^).
если вы хотите удалить ваши изменения, связанные с отсоединенной головой
вам нужно только проверить ветку, в которой Вы были, например
git checkout masterв следующий раз, когда вы изменили файл и хотите восстановить его в том состоянии, в котором он находится в индексе, не удаляйте файл первым, просто сделай
git checkout -- path/to/fooэто восстановит файл foo до состояния, в котором он находится в индексе.
если вы хотите сохранить ваши изменения, связанные с отсоединенной головой
- выполнить
git log -n 1; это отобразит самую последнюю фиксацию на отсоединенной голове. Скопируйте и вставьте хэш фиксации.- выполнить
git checkout master- выполнить
git branch tmp <commit-hash>. Это сохранит ваши изменения в новой ветке под названиемtmp.- если вы хотел бы включить изменения, которые вы внесли в
master, используяgit merge tmpСmasterфилиала. Вы должны быть наmasterфилиала после запускаgit checkout master.
Если вы изменили файлы, которые вы не хотите потерять, вы можете подтолкнуть их. Я зафиксировал их в отключенном режиме, и после этого вы можете перейти во временную ветвь, чтобы интегрироваться позже в master.
git commit -m "....." git branch my-temporary-work git checkout master git merge my-temporary-workисточник:
решение без создания временной ветке.
как выйти ("исправить") отделенное состояние головы когда вы уже что-то изменилось в этом режиме и, дополнительно, хотите сохранить изменения:
сохранить изменения, которые вы хотите сохранить. если вы хотите взять на себя какие-либо изменения, которые вы сделали в отстраненном состоянии головы, зафиксируйте их. Например:
git commit -a -m "your commit message"отменить изменения, которые вы делаете не хочу держать. жесткий сброс отбросит любые незафиксированные изменения, которые вы сделали в состоянии отсоединенной головы:
git reset --hard(без этого Шаг 3 потерпел бы неудачу, жалуясь на измененные незафиксированные файлы в отсоединенной голове.)
проверить вашу ветку. выйдите из состояния отсоединенной головы, проверив ветвь, над которой вы работали раньше, например:
git checkout masterвозьмите на себя ваши коммиты. вы теперь вы можете взять на себя обязательства, которые вы сделали в состоянии отсоединенной головы, собирая вишни, как показано в мой ответ на другой вопрос.
git reflog git cherry-pick <hash1> <hash2> <hash3> …
отрезанная голова, означает:
- ты больше не на ветке,
- вы проверили один коммит в истории
если у вас нет изменений: вы можете переключиться на master, применив следующую команду
git checkout masterесли у вас есть изменения, которые вы хотите сохранить:
в случае отсоединенной головы, фиксирует работу как обычно, за исключением того, что ни одна именованная ветвь не обновляется. Чтобы получить master branch обновлено с вашими зафиксированными изменениями, сделайте временную ветвь, где вы находитесь (таким образом, временная ветвь будет иметь все зафиксированные изменения, которые вы сделали в отсоединенной головке), затем переключитесь на главную ветвь и объедините временную ветвь с главной.
git branch temp git checkout master git merge temp
вот что я только что сделал после того, как понял, что я был на отстраненной голове и уже внес некоторые изменения.
Я совершил изменения.
$ git commit -m "..." [detached HEAD 1fe56ad] ...я вспомнил хэш (1fe56ad) фиксации. Затем я проверил ветку, на которой должен был быть.
$ git checkout master Switched to branch 'master'наконец, я применил изменения фиксации к ветке.
$ git cherry-pick 1fe56ad [master 0b05f1e] ...Я думаю, что это немного проще, чем создание временной ветви.
когда вы проверяете конкретную фиксацию в
git, вы отрезанная голова государство...то есть ваша рабочая копия больше не отражает состояние именованной ссылки (например, "master"). Это полезно для изучения прошлого состояния репозитория, но не то, что вы хотите, если вы на самом деле пытаетесь вернуть изменения.если вы внесли изменения в определенный файл, и вы просто хотите их отменить, вы можете использовать как это:
git checkout myfileэто отбросит любые незафиксированные изменения и вернет файл в любое состояние, которое он имеет в голове вашей текущей ветви. Если вы хотите отменить изменения, которые вы уже совершили, вы можете использовать . Например, это приведет к сбросу репозитория в состояние предыдущей фиксации, отбрасывая любые последующие изменения:
git reset --hard HEAD^однако, если Вы делитесь репозиторием с другими людьми, a
git resetможет быть разрушительный (потому что он стирает часть истории репозитория). Если вы уже поделились изменениями с другими людьми, вы обычно хотите посмотреть наgit revertвместо этого, который генерирует "anticommit" -- то есть, он создает новую фиксацию, которая" отменяет " изменения, о которых идет речь.ГИТ Книга более подробную информацию.
Если вы внесли некоторые изменения, а затем поняли, что вы находитесь на отсоединенной голове, есть простое решение для этого: stash - > checkout master - > stash pop:
git stash git checkout master # Fix the detached head state git stash pop # ... or for extra safety use 'stash apply' then later # after fixing everything do 'stash drop'у вас будут незафиксированные изменения и нормальная "прикрепленная" голова, как будто ничего не произошло.
поскольку "отделенное головное состояние" имеет вас на временной ветке, просто используйте
git checkout -что ставит вас на последнюю ветку, на которой вы были.
дополнительное соглашение
если ветка, в которую вы хотите вернуться, была последней проверкой, которую вы сделали, вы можете просто использовать
checkout @{-1}. Это позволит вам вернуться к предыдущему оформлению заказа.кроме того, вы можете псевдоним этой команды, например,
git global --config alias.prevТак что вам просто нужно ввестиgit prevчтобы вернуться к предыдущей проверке.
git pull origin masterработал для меня. Речь шла только о том, чтобы явно указать имя удаленного и ветви.
в моем случае, я запускаю
git statusи я увидел, что у меня было несколько неотслеживаемые файлы на моем рабочем каталоге.Мне просто нужно было очистить их (так как они мне не нужны), чтобы запустить ребаз, который я хотел выполнить.
возможно, вам придется сначала очистить свою ветку, чтобы проверить master. - f заставляет действовать.
git clean -fтогда вы сможете проверить свою ветку мачты, как указано выше
git checkout master

Comments