Ответ 1
Создайте ветвь, где вы находитесь, затем переключитесь на мастер и объедините ее:
git branch my-temporary-work
git checkout master
git merge my-temporary-work
Используя git, я сделал что-то вроде этого
git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)
Поскольку мне сказали, что я все еще могу совершать действия, находясь в оторванном состоянии, я так и сделал. Но теперь я хочу объединить мою отделенную головную ветку и мою локальную главную ветвь, а затем перенести мою кучу изменений в origin/master.
Итак, мой вопрос: как я могу объединить основную ветвь с моим текущим состоянием (отделенная голова)?
Создайте ветвь, где вы находитесь, затем переключитесь на мастер и объедините ее:
git branch my-temporary-work
git checkout master
git merge my-temporary-work
Вы могли бы сделать что-то вроде этого.
# Create temporary branch for your detached head
git branch tmp
# Go to master
git checkout master
# Merge in commits from previously detached head
git merge tmp
# Delete temporary branch
git branch -d tmp
Еще проще было бы
git checkout master
git merge [email protected]{1}
но есть небольшая опасность, что, если вы допустите ошибку, будет немного сложнее восстановить коммиты, сделанные на отсоединенной голове.
Вы можете просто сделать git merge <commit-number>
или git cherry-pick <commit> <commit> ...
Как предложил Райан Стюарт, вы также можете создать ветку из текущего HEAD:
git branch brand-name
Или просто тег:
git tag tag-name
Это то, что я сделал:
В принципе, подумайте о detached HEAD
как о новой ветке, без имени. Вы можете вступить в эту ветку точно так же, как любая другая ветвь. Как только вы закончите совершать, вы хотите нажать его на пульте дистанционного управления.
Итак, первое, что вам нужно сделать, это дать этому detached HEAD
имя. Вы можете легко сделать это, находясь на этом detached HEAD
:
git checkout -b some-new-name
Теперь вы можете направить его на удаленный, как любая другая ветвь.
В моем случае, я также хотел перемотать эту ветвь, чтобы справиться с коммитами, которые я сделал в detached HEAD
(теперь some-new-branch
). Все, что я сделал, было
git checkout master
git pull # To make sure my local copy of master is up to date
git checkout some-new-branch
git merge master // This added current state of master to my changes
Конечно, я объединил его позже в master
.
Что об этом.
В случае отсоединенного HEAD, он работает как обычный, за исключением того, что ни одна ветвь не обновляется. Чтобы получить мастер-ветку, обновленную с внесенными вами изменениями, создайте временную ветку, где вы находитесь (таким образом, временная ветка будет иметь все совершенные изменения, сделанные вами в отсоединенной головке), затем переключитесь на главную ветвь и объедините временную ветку с мастер.
git branch temp
git checkout master
git merge temp
Простое решение - просто создать новую ветку для этого коммита и оформить заказ: git checkout -b <branch-name> <commit-hash>
.
Таким образом, все сделанные вами изменения будут сохранены в этой ветке. если вам нужно очистить ветку master от оставшихся коммитов, обязательно запустите git reset --hard master
.
При этом вы будете переписывать свои ветки, поэтому будьте уверены, что никому не мешаете эти изменения. Обязательно ознакомьтесь с этой статьей, чтобы лучше понять состояние отдельного HEAD.
Я также основал статью, в которой объяснил, как обрабатывать. Я добавляю его, потому что он немного отличается от того, что было предложено. Но я думаю, что все предложения действительны.
http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html
Позже я приму первый ответ как хороший
Возможно, это не лучшее решение (переписать историю), но вы также можете сделать git reset --hard <hash of detached head commit>
.