Как сохранить изменения в состоянии detached-head?

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

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

git commit

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

3 ответов


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

вы:
master: a-b-c-d-e-f

и хотел изменить c. Ты:
* git checkout c (избегайте проверки коммитов в будущем. Вместо этого переместите головку ветки)
* изменены некоторые файлы

вы находитесь в:

master: a-b-c-d-e-f
             \uncommitted-work,detached

если вы хотите повторно примените d-e-f поверх измененного "c"

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

  1. git stash .
  2. git checkout master
  3. git stash pop (разрешение конфликтов)
  4. git stage .
  5. git commit -m "temporary name for g"
  6. (master: a-b-c-d-e-f-g)
  7. git rebase c -i ("повторно примените мою текущую ветвь к точке c и позвольте мне манипулировать коммитами в интерактивном режиме", i.e, re-parent (rebase) d-e-f на новый c)
  8. соблюдать руководство по интерактивные перебазирования. Вы хотите изменить порядок g Итак, после c, затем измените команду rebase с pick to fixup. dd удалить строку, P на место он, i чтобы войти в режим вставки, введите "fixup", затем :wq для сохранения и выхода из vim.
  9. (master: a-b-c'-d'-e'-f', где c' результат вы слияния g и c в ходе ребаз. d-e-f стали d'-e'-f' поскольку их родословная изменилась, поэтому они не являются" одинаковыми " коммитами, насколько это касается git, но их содержимое остается тем же)

если вы хотите отменить d-e-f (и перепишите историю, как будто вы никогда их не делали)

(если вы толкнули, люди вниз по течению будут иметь взыскать с вышерасположенных перебазировать) :

  1. git stash .
  2. git checkout master
  3. (master: a-b-c-d-e-f, С спрятанными файлами, первоначально основанными на c)
  4. git reset --hard c (отбросьте все файлы и коммиты на master начиная с c)
  5. (master: a-b-c, С спрятал файлы)
  6. git stash pop (разрешение конфликтов)
  7. (master: a-b-c-*)
  8. git stage .
  9. git commit -m "description of g"
  10. (master: a-b-c-g)

если вы хотите отменить D-e-f (но держите их в истории)

  1. git stash
  2. git revert --no-commit d
  3. git revert --no-commit e
  4. git revert --no-commit f
  5. git push
  6. git stash pop (конфликтов не будет)
  7. git stage .
  8. git commit -m "Undo d-e-f in order to fix..."
  9. git push

если у вас git push d-e - f, и вы хотите держать их отдельно:

похоже, что ваши новые изменения предназначены для новой ветви мастер. git branch <foo>.


создайте новую ветвь из этой фиксации, а затем выполните commit:

git checkout -b <branchname>
git commit 

предполагая, что вы уже поставили (т. е. git add myfile1 myfile2) ваших файлов.


сохранить вашу работу в отдельной главе:

git checkout -b <new-branch-name-for-detached-head> <sha-of-the-detached-head>

и если вы хотите объединить его с главного:

git checkout master
git merge <new-branch-name-you-have-just-created>