Зафиксировать отсоединенную головку Git?

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

svn up .

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

git checkout HEAD^ src/

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

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

Ответы

Ответ 1

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

Если вы хотите удалить свои изменения, связанные с отделенным HEAD

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

git checkout master

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

git checkout -- path/to/foo

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

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

  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.

Ответ 2

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

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Извлечен из:

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

Ответ 3

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

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

  1. Зафиксируйте изменения, которые вы хотите сохранить. Если вы хотите взять на себя какие-либо изменения, сделанные вами в отдельном состоянии HEAD, зафиксируйте их. Подобно:

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

    git reset --hard
    

    (Без этого шаг 3 не удался, жалуясь на измененные незафиксированные файлы в отдельно стоящей HEAD.)

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

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

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

Ответ 4

Отдельная головка означает:

  1. Вы больше не находитесь в филиале,
  2. Вы проверили одиночную фиксацию в истории

Если у вас нет изменений: вы можете переключиться на мастер, выполнив следующую команду

  git checkout master

Если у вас есть изменения, которые вы хотите сохранить:

В случае отсоединенной HEAD выполняет работу как обычно, за исключением того, что именованная ветка не обновляется. Чтобы получить мастер-ветку, обновленную с внесенными вами изменениями, создайте временную ветку, где вы находитесь (таким образом, временная ветка будет иметь все совершенные изменения, сделанные вами в отсоединенной головке), затем переключитесь на главную ветвь и объедините временную ветку с хозяин.

git branch  temp
git checkout master
git merge temp

Ответ 5

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

Я совершил изменения.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Я вспомнил хэш (1fe56ad) коммита. Затем я проверил ветку, в которой я должен был быть.

$ git checkout master
Switched to branch 'master'

Наконец, я применил изменения фиксации к ветке.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

Я думаю, что это немного легче, чем создание временной ветки.

Ответ 6

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

У вас будут ваши неустановленные изменения и нормальная "прикрепленная" HEAD, как будто ничего не произошло.

Ответ 7

Когда вы проверяете конкретную фиксацию в git, вы попадаете в состояние отдельной головы... то есть ваша рабочая копия больше не отражает состояние именованной ссылки (например, "мастер" ). Это полезно для изучения прошлого состояния репозитория, но не того, что вы хотите, если вы действительно пытаетесь вернуть изменения.

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

git checkout myfile

Это отменит любые незафиксированные изменения и вернет файл в любое состояние, имеющееся в голове вашей текущей ветки. Если вы хотите отменить изменения, которые вы уже совершили, вы можете использовать команду reset. Например, это будет reset репозиторий для состояния предыдущего фиксации, отбрасывая любые последующие изменения:

git reset --hard HEAD^

Однако, если вы используете репозиторий совместно с другими людьми, git reset может быть разрушительным (поскольку он удаляет часть истории хранилища). Если вы уже поделились изменениями с другими людьми, вы обычно хотите посмотреть git revert вместо этого, который генерирует "антикоммит", то есть он создает новую фиксацию, которая "отменяет" изменения, о которых идет речь.

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

Ответ 8

Так как "состояние отсоединенной головки" имеет вас на ветке temp, просто используйте git checkout -, который помещает вас в последнюю ветку, в которой вы были.

Ответ 9

Чтобы подробнее разъяснить @Philippe Gerber ответ, вот он:

git cherry-pick

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

Ответ 10

Добавление

Если ветка, в которую вы хотите вернуться, была последней проверкой, которую вы сделали, вы можете просто использовать checkout @{-1}. Это вернет вас к предыдущей проверке.

Кроме того, вы можете выполнить псевдоним этой команды, например, с помощью git global --config alias.prev, так что вам просто нужно ввести git prev, чтобы переключиться на предыдущую проверку.

Ответ 11

Нахождение в "отделенной голове" означает, что HEAD ссылается на конкретную безымянную фиксацию (как противоположность именованной ветки) (см. Раздел https://git-scm.com/docs/git-checkout Detached head)

Чтобы решить проблему, вам нужно только выбрать ветку, которая была выбрана ранее

git checkout @{-1}

Ответ 12

Гит сказал мне, как это сделать.

если вы набрали:

git checkout <some-commit_number>

Сохранить статус

git add .
git commit -m "some message"

Затем:

 git push origin HEAD:<name-of-remote-branch>

Ответ 13

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

git add .

Но если вы только изменили или удалили существующие файлы, вы можете одновременно добавить (-a) и зафиксировать сообщение (-m) с помощью:

git commit -a -m "my adjustment message"

Затем вы можете просто создать новую ветку с вашим текущим состоянием с помощью:

git checkout -b new_branch_name

У вас будет новая ветка, и все ваши настройки будут в этой новой ветке. Затем вы можете продолжить нажимать на пульт и/или оформить заказ/вытащить/объединить, как вам угодно.

Ответ 14

git pull origin master

работал у меня. Это просто давало явное имя удаленной и ветки.

Ответ 15

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

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

Ответ 16

Я хотел сохранить свои изменения так, я просто исправляю это, делая...

git add .
git commit -m "Title" -m "Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git push TOYOURCURRENTBRANCH

это работа для меня

Ответ 17

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

git clean -f

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

git checkout master

Обратите внимание: это приведет к удалению файлов, поэтому используйте их, только если вы действительно не заботитесь о файлах

Ответ 18

Чтобы избавиться от Частной главы, вам нужно знать, почему эта проблема наступила. Его показ отдельной главы, потому что вы объедините свой проект несколько раз (или атлас дважды), просто выполнив локальный проект. Что вам нужно сделать, так это то, что каждый раз, когда вы объединяете свой проект, просто скопируйте его локально, а также в ветвь сервера. Это решит вашу проблему, как и моя.

Оригинальный ответ на: Отдельная проблема с HEAD в Android Studio