Как зафиксировать файлы в режиме ditached head в ветке
Я оказался в странной ситуации, когда я извлекал предыдущий коммит в моей ветке v4.1.0-rc12. Я изменил некоторые файлы и хочу зафиксировать их в ветке v4.1.0-rc12.
Теперь, когда указатель HEAD находится в отдельном режиме, так как я извлек предыдущий коммит, как мне зафиксировать эти изменения в ветке v4.1.0-rc12 в отдельном режиме?
Хотелось бы, чтобы я сделал "возврат" вместо "проверки" хеша коммита.
Есть ли какое-либо решение для фиксации отредактированных файлов и добавления их в мою ветку v4.1.0-rc12?
Это то, что показывает мой "git reflog"
441bfac HEAD@{0}: commit: Resolved #110
dc00e4f HEAD@{1}: checkout: moving from v4.1.0-rc12 to dc00e4f
2542748 HEAD@{2}: commit: Login & SignUp revamp (Broken)
dc00e4f HEAD@{3}: commit: Resolved #109 and #110
4472914 HEAD@{4}: commit: Resolved #108
Я хочу сохранить 441bfac для v4.1.0-rc12
Любая помощь или идеи будут оценены.
4 ответа
Способ 1:
$ git checkout v4.1.0-rc12 branch
(see if it succeeds, if so):
$ git add ... # if / as needed
$ git commit
Это может не сработать, потому что git checkout
step откажется переключиться на ветку, если (и только если) упомянутое переключение уничтожит уже внесенные изменения.
git checkout
шаг будет успешным, и перенесите ваши изменения, если сможете.
Если git checkout
шаг успешен, это самый простой способ справиться со всем этим. Если нет, перейдите к альтернативным методам.
Способ 2 ( ответ Ави):
$ git checkout -b tempbranch
$ git add ... # as and if needed
$ git commit
Это (-b tempbranch
) создает новую временную ветвь, указывающую на коммит, на котором вы ранее отсоединили свою HEAD. git commit
затем создает новый коммит в этой временной ветке:
o--o--o <-- v4.1.0-rc12 branch
/
...--o--o
\
o <-- tempbranch
Теперь вы можете git checkout
все, что вы хотите, и обязательство вы сделали на tempbranch
постоянно хранится в вашем хранилище (ну, постоянно, если / пока вы не удалите имя tempbranch
), который позволяет вам копировать из него содержимое в любое время.
Способ 3:
$ git stash
$ git checkout v4.1.0-rc12 branch
$ git stash apply # or even "git stash pop" but I prefer "apply"
... check everything out ...
... if it all looks right ...
$ git stash drop # "git stash pop" means "apply and then auto-drop"
Какие git stash
делает это сделать коммит (ну, на самом деле это два коммита), которых нет ни в одной ветви. Эффект такой же, как при создании временной ветки. Это оставляет проблему удаления не ветви, когда вы закончите с этим, так git stash drop
удаляет неназванную не ветвь, которая содержит коммиты.
git stash apply
шаг по существу (хотя это сложнее, чем это) черри выбирает коммит, который git stash
сделано, где бы вы ни находились: так что это похоже на то, как вы выбираете коммит, на котором вы сделали tempbranch
,
Обратите внимание, что git stash pop
автоматически вызывает git stash drop
, даже если результат git stash apply
это беспорядок, вы потеряли свои временные коммиты, если вы pop
но не если ты apply
, Если все идет хорошо, нет никакой разницы и pop
удобнее; это всего лишь тот случай, когда лучше оставить след от крошки на случай, если дела пойдут плохо.
(Между прочим, мои личные предпочтения - сначала метод 1, если возможно, затем обычно 2, затем 3, но иногда - когда я уверен, что он сработает - я предпочитаю метод 3, а не метод 2.)
Сначала создайте новую ветку из вашего предыдущего коммита, извлеките ее во вновь созданную ветку, обновите ваши файлы и затем зафиксируйте изменения. После этого вы можете объединить свои изменения с любой веткой.
У меня была аналогичная ситуация, и я решил так, как в вашем случае:
git checkout v4.1.0-rc12
git merge 441bfac
Общий случай:
git checkout branch-to-have-the-changes
git merge changes-that-we-previously-made-id
Если ваши новые изменения зафиксированы в отдельном HEAD, и вы хотите, чтобы v4.1.0-rc12 также указывал на этот же коммит:
git branch -f v4.1.0-rc12 HEAD
git checkout v4.1.0-rc12