Что делать с commit made in a detached head

используя 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 (wich does complete because there was some error due to the fact that i'm no more on master)

потому что git сказал мне, что я могу совершить сталь, когда в отстраненном состоянии головы, я сделал это. Но теперь я хочу объединить мою отделенную головную ветвь и мою локальную главную ветвь, а затем подтолкнуть мою кучу изменений к origin/master.

Итак, мой вопрос в том, как я могу объединить главную ветвь с моим фактическим состоянием (отделенной головой)

8 ответов


создайте ветку, где вы находитесь, затем переключитесь на 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 temproary branch
git branch -d tmp

еще проще было бы

git checkout master
git merge HEAD@{1}

но это имеет небольшую опасность, что если вы сделаете ошибку, может быть немного сложнее восстановить коммиты, сделанные на отсоединенной голове.


вы можете просто сделать git merge <commit-number> или git cherry-pick <commit> <commit> ...

как предложил Райан Стюарт, вы также можете создать ветку из текущей головы:

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.

вот и все.


в случае отсоединенной головы совершает работу как обычно, за исключением того, что не обновляется именованная ветвь. Чтобы обновить главную ветвь с вашими зафиксированными изменениями, сделайте временную ветвь, где вы находитесь (таким образом , временная ветвь будет иметь все зафиксированные изменения, которые вы сделали в отдельной головке), затем переключитесь на главную ветвь и объедините временную ветвь с главной.

git branch  temp
git checkout master
git merge temp

Я также основал статью, где объясняется, как обрабатывать. Я добавляю его, потому что он немного отличается от того, что было предложено. Но я думаю, что все предложения действительны

http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html

позже я приму первый ответ как хороший друг


возможно, не лучшее решение (перепишет историю), но вы также можете сделать git reset --hard <hash of detached head commit>.


простое исправление - просто создать новую ветку для этой фиксации и проверки на нее:git checkout -b <branch-name> <commit-hash>.

таким образом, все внесенные изменения будут сохранены в этой ветке. Если вам нужно очистить главную ветку от остатков коммитов, обязательно запустите git reset --hard master.

С этим вы будете переписывать свои ветви, поэтому не беспокойте никого этими изменениями. Не забудьте взглянуть на эту статью для лучшей иллюстрации отрезанная голова государство.