Что делать с коммитом сделанным в отстраненной голове


281

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

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



Если бы вы могли добавить снимок экрана с деревом коммитов в этом состоянии (как коммит на отсоединенной голове действительно выглядит в gitk или SourceTree), это сделало бы этот вопрос еще лучше.
Флорисла

К сожалению, на данный момент я не могу, но если вы можете обеспечить, я буду рад видеть это здесь. Даже если это должно быть ничья, это прояснит
ситуацию

Ответы:


478

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

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

12
как избежать отрыва головы в будущем?
Ycomp

Я сделал это и оказался впереди 5 коммитов. В таком случае вы просто делаете git push origin?
Виннемукка

5
странно, я получаю "Уже в курсе". при объединении моей временной работы
Роберт Синклер

10
Не забудьте удалить мою временную работу с помощью "git branch -d my
капитан

5
@ycomp "detached head" происходит, когда вы редактируете файлы старого коммита, а затем фиксируете файлы без ветки, чтобы позже ссылаться на этот новый коммит. Чтобы избежать отстраненной головы, не проверяйте старые коммиты. Если вам по-прежнему нужны все файлы оттуда, но в качестве нового коммита, вы можете извлечь каталог из коммита, а не сам коммит. Смотрите этот ответ
lucidbrot

96

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

# 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 HEAD@{1}

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


4
Я знаю, что это годы спустя, но спасибо за этот ответ. Я не считал себя законченным поиском с принятым ответом здесь, потому что я не хотел обходить временную ветку, и у этого ответа есть команда, чтобы удалить его.
Джереми Придемор

8
Если вы решите использовать эту команду, git merge HEAD@{1}вы, вероятно, должны убедиться, что именно ту, которую вы хотите использовать,git reflog
Michael Stramel

3
Возможность слияния HEAD @ {1} спасла мне жизнь, так как я предварительно опробовал мастер.
JUIL

странно, я получаю "Уже в курсе". при объединении tmp (но файлы разные)
Роберт Синклер,

19

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

В основном, подумайте о detached HEAD новой ветке, без названия. Вы можете зафиксировать в этой ветке, как и в любой другой ветке. Как только вы закончите фиксацию, вы хотите отправить его на пульт.

Итак, первое, что вам нужно сделать, это дать detached HEADему имя. Вы можете легко сделать это, находясь на этом detached HEAD:

git checkout -b some-new-branch

Теперь вы можете отправить его на удаленный, как и любой другой филиал.

В моем случае, я также хотел бы быстро перенести эту ветку на мастеринг вместе с коммитами, которые я сделал в 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 .

Вот и все.


1
Этот ответ сработал для меня там, где другие не сработали. git checkout -b new-branchработал на меня. Другие предложения требовали git branch new-branch, но это оставило меня все еще в отстраненной голове, и новая ветвь не приняла мои изменения.
Джесси Патель

17

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

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

git branch brand-name

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

git tag tag-name

Вы можете найти свой номер коммита на отдельной голове:git rev-parse HEAD
KOGI

6

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

git branch  temp
git checkout master
git merge temp

3

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

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

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


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.