Исправить отсоединенную голову Git?

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

svn up .

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

git checkout HEAD^ src/

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

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

13 ответов


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

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

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

git checkout master

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

git checkout -- path/to/foo

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

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

  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 вместо этого, который генерирует "антикоммит" - то есть, он создает новую фиксацию, которая "отменяет" рассматриваемые изменения.

Книга Git более подробную информацию.


Если вы внесли некоторые изменения, а затем поняли, что находитесь на отдельной голове, для этого есть простое решение: 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 . Кроме того, это необходимо только с commit на detached head.


git pull origin master

работал для меня. Это было просто о том, чтобы дать удаленное и название ветви явно.


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

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


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

git clean -f

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

git checkout master