Как сохранить изменения в состоянии 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"
(если вы толкнули, люди вниз по течению будут иметь взыскать с вышерасположенных перебазировать)
git stash .
git checkout master
-
git stash pop
(разрешение конфликтов) git stage .
git commit -m "temporary name for g"
- (
master: a-b-c-d-e-f-g
) -
git rebase c -i
("повторно примените мою текущую ветвь к точке c и позвольте мне манипулировать коммитами в интерактивном режиме", i.e, re-parent (rebase)d-e-f
на новыйc
) - соблюдать руководство по интерактивные перебазирования. Вы хотите изменить порядок
g
Итак, после c, затем измените команду rebase сpick
tofixup
.dd
удалить строку,P
на место он,i
чтобы войти в режим вставки, введите "fixup", затем:wq
для сохранения и выхода из vim. - (
master: a-b-c'-d'-e'-f'
, гдеc'
результат вы слиянияg
иc
в ходе ребаз.d-e-f
сталиd'-e'-f'
поскольку их родословная изменилась, поэтому они не являются" одинаковыми " коммитами, насколько это касается git, но их содержимое остается тем же)
если вы хотите отменить d-e-f
(и перепишите историю, как будто вы никогда их не делали)
(если вы толкнули, люди вниз по течению будут иметь взыскать с вышерасположенных перебазировать) :
git stash .
git checkout master
- (
master: a-b-c-d-e-f
, С спрятанными файлами, первоначально основанными на c) -
git reset --hard c
(отбросьте все файлы и коммиты на master начиная с c) - (
master: a-b-c
, С спрятал файлы) -
git stash pop
(разрешение конфликтов) - (
master: a-b-c-*
) git stage .
git commit -m "description of g"
- (
master: a-b-c-g
)
если вы хотите отменить D-e-f (но держите их в истории)
git stash
git revert --no-commit d
git revert --no-commit e
-
git revert --no-commit f
-
git push
-
git stash pop
(конфликтов не будет) git stage .
git commit -m "Undo d-e-f in order to fix..."
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>