Что делать с фиксацией, сделанной в отрешенной голове


С помощью 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 191

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.

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