Как зафиксировать файлы в режиме 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
Другие вопросы по тегам