Починить отсоединенную голову Гита?



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



svn up .


используя git pull Кажется, не работает. Какой-то случайный поиск привел меня на сайт, где кто-то рекомендовал делать



git checkout HEAD^ src/


(src - это каталог, содержащий удаленные файлы).



теперь я узнаю, что у меня есть отдельный голова. Я понятия не имею, что это. Как я могу отменить?

576   13  
git

13 ответов:

отсоединенная головка означает, что вы больше не находитесь на ветке, вы проверили одну фиксацию в истории (в этом случае фиксация предшествует HEAD, т. е. HEAD^).

если вы хотите удалить ваши изменения, связанные с отсоединенной головой

вам нужно только проверить ветку, в которой Вы были, например

git checkout master

в следующий раз, когда вы изменили файл и хотите восстановить его в том состоянии, в котором он находится в индексе, не удаляйте файл первым, просто сделай

git checkout -- path/to/foo

это восстановит файл foo до состояния, в котором он находится в индексе.

если вы хотите сохранить ваши изменения, связанные с отсоединенной головой

  1. выполнить git log -n 1; это отобразит самую последнюю фиксацию на отсоединенной голове. Скопируйте и вставьте хэш фиксации.
  2. выполнить git checkout master
  3. выполнить git branch tmp <commit-hash>. Это сохранит ваши изменения в новой ветке под названием tmp.
  4. если вы хотел бы включить изменения, которые вы внесли в 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

источник:

что делать с фиксацией, сделанной в отрешенной голове

решение без создания временной ветке.

как выйти ("исправить") отделенное состояние головы когда вы уже что-то изменилось в этом режиме и, дополнительно, хотите сохранить изменения:

  1. сохранить изменения, которые вы хотите сохранить. если вы хотите взять на себя какие-либо изменения, которые вы сделали в отстраненном состоянии головы, зафиксируйте их. Например:

    git commit -a -m "your commit message"
    
  2. отменить изменения, которые вы делаете не хочу держать. жесткий сброс отбросит любые незафиксированные изменения, которые вы сделали в состоянии отсоединенной головы:

    git reset --hard
    

    (без этого Шаг 3 потерпел бы неудачу, жалуясь на измененные незафиксированные файлы в отсоединенной голове.)

  3. проверить вашу ветку. выйдите из состояния отсоединенной головы, проверив ветвь, над которой вы работали раньше, например:

    git checkout master
    
  4. возьмите на себя ваши коммиты. вы теперь вы можете взять на себя обязательства, которые вы сделали в состоянии отсоединенной головы, собирая вишни, как показано в мой ответ на другой вопрос.

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

отрезанная голова, означает:

  1. ты больше не на ветке,
  2. вы проверили один коммит в истории

если у вас нет изменений: вы можете переключиться на 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 чтобы вернуться к предыдущей проверке.

чтобы уточнить ответ @ Philippe Gerber, вот он:

git cherry-pick

до cherry-pick, a git checkout master необходимо в этом случае. Кроме того, это необходимо только с commit на detached head.

git pull origin master

работал для меня. Речь шла только о том, чтобы явно указать имя удаленного и ветви.

в моем случае, я запускаю git status и я увидел, что у меня было несколько неотслеживаемые файлы на моем рабочем каталоге.

Мне просто нужно было очистить их (так как они мне не нужны), чтобы запустить ребаз, который я хотел выполнить.

возможно, вам придется сначала очистить свою ветку, чтобы проверить master. - f заставляет действовать.

git clean -f

тогда вы сможете проверить свою ветку мачты, как указано выше

git checkout master

Comments

    Ничего не найдено.