Что делать с коммитом сделанным в отстраненной голове - PullRequest
234 голосов
/ 19 августа 2011

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

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

Ответы [ 7 ]

408 голосов
/ 19 августа 2011

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

git branch my-temporary-work
git checkout master
git merge my-temporary-work
78 голосов
/ 19 августа 2011

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

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

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

17 голосов
/ 19 августа 2011

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

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

git branch brand-name

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

git tag tag-name
12 голосов
/ 22 октября 2015

Вот что я сделал:

По сути, представьте себе 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.

Вот и все.

6 голосов
/ 31 октября 2016

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

git branch  temp
git checkout master
git merge temp
2 голосов
/ 07 мая 2018

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

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

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

1 голос
/ 24 мая 2016

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

...