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

Используя 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.

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

Ответы

Ответ 1

Создайте ветвь, где вы находитесь, затем переключитесь на мастер и объедините ее:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

Ответ 2

Вы могли бы сделать что-то вроде этого.

# 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}

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

Ответ 3

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

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

git branch brand-name

Или просто тег:

git tag tag-name

Ответ 4

Это то, что я сделал:

В принципе, подумайте о 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.

Что об этом.

Ответ 5

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

git branch  temp
git checkout master
git merge temp

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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