Что делать с коммитом сделанным в отстраненной голове
Используя 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)
Поскольку мерзавец сказал мне, что я могу выполнять коммит, находясь в отстраненном состоянии, я так и сделал. Но теперь я хочу объединить мою отделенную головную ветку и мою локальную главную ветвь, а затем перенести мою кучу изменений в origin / master.
Поэтому мой вопрос: как я могу объединить основную ветвь с моим текущим состоянием (отстраненная голова)?
13 ответов
Создайте ветку, в которой вы находитесь, затем переключитесь на 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}
но есть небольшая опасность, что если вы допустите ошибку, может быть немного сложнее восстановить коммиты, сделанные на отсоединенной голове.
Вот что я сделал:
В основном, подумайте о 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 merge <commit-number>
или же git cherry-pick <commit> <commit> ...
По предложению Райана Стюарта вы также можете создать ветку из текущей HEAD:
git branch brand-name
Или просто тег:
git tag tag-name
В качестве альтернативы вы можете выбрать идентификатор фиксации для своей ветки.
<commit-id> made in detached head state
git checkout master
git cherry-pick <commit-id>
Никаких временных веток, никакого слияния.
Я вижу, что почти все предлагали решение, в котором создается временная ветка. Теперь нужно признать, что всякий раз, когда возникает эта проблема «зафиксировано в отсоединенном состоянии», она обычно обнаруживается после одной фиксации. И создание одной целой ветки для этого маленького коммита - звучит слишком много, не так ли? Особенно в проектах, где вы уже прыгаете среди слишком большого количества веток.
Какой же тогда легкий путь? Используйте хеш фиксации!
Как мне это получить?
- Сделайте. Вы бы увидели что-то вроде этого:
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD)
Author: Someone <someone@something.com>
Date: S/om/eday SO:ME:TI:ME
A commit message that doesn't mean much
commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master, master)
Author: Someone <someone@something.com>
Date: Some/other/day SOME:OTHER:TIME
Another commit message that doesn't mean much
commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date: Thu Jul 8 08:38:12 2021 +0530
Enough reading the example, focus on the answer!!
Сейчас хоть и выглядит нормальный случай, но когда делаешь
git push
он сказал бы: «Все актуально».
Внимательный человек увидел бы, что это «не актуально». где-то кроме хозяина.
- Так, что дальше? Просто скопируйте начальные символы хеша
10bf8fe4d1
. И сначала сделайте. Это переместит вас кmaster
ветка. А теперь, поскольку вы уже скопировали хеш. Вы можете сделатьgit merge <hash>
. Сделайтеgit log
сейчас
И ВОЙЛА:
commit 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 (HEAD -> master)
Author: Someone <someone@something.com>
Date: S/om/eday SO:ME:TI:ME
A commit message that doesn't mean much
commit a3cd1cedf1962916cdc2945f2bd2b271ec8b919d (origin/master)
Author: Someone <someone@something.com>
Date: Some/other/day SOME:OTHER:TIME
Another commit message that doesn't mean much
commit 1bfabbe09c70419070fe29ff1ed276c0207bbe10
Author: Someone <someone@something.com>
Date: Thu Jul 8 08:38:12 2021 +0530
Enough reading the example, focus on the answer!!
Теперь
HEAD
кажется, находится в нужном месте.
Кто-то может спросить: «А что, если у меня нет хэша? Я ничего не знал о зависшей фиксации и только что сделал». Не волнуйся, я тебя прикрыл. Вы можете найти хеш фиксации в двух местах:
- Когда вы сделали
git checkout master
,git
предупреждал тебя вот так
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
10bf8fe A commit message that doesn't mean much
If you want to keep it by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> 10bf8fe
Switched to branch 'master'
Вы можете увидеть свое сокровище (
hash
), верно?
- Не говорите мне, что не можете его найти. Это прямо там. Но если вы действительно не можете, тогда вы можете сделать
git reflog
. Он покажет вам что-то вроде этого:
a3cd1ce (HEAD -> master, origin/master) HEAD@{0}: checkout: moving from 10bf8fe4d17bb7de59586a7abb6db321f0786bb3 to master
10bf8fe HEAD@{1}: commit: A commit message that doesn't mean much
Вы видите, что это сокровище, которое вы искали ... Хэш.
Я предполагаю, что это охватывает все возможные сценарии, которые могут произойти в отключенном состоянии с зависшей фиксацией. Остерегайтесь в следующий раз !!
В случае отсоединенного HEAD коммиты работают как обычно, за исключением того, что ни одна из названных веток не обновляется. Чтобы обновить основную ветвь с вашими зафиксированными изменениями, создайте временную ветвь там, где вы находитесь (таким образом, временная ветвь будет иметь все зафиксированные изменения, сделанные вами в отсоединенном HEAD), затем переключитесь на основную ветвь и объедините временную ветвь с хозяин.
git branch temp
git checkout master
git merge temp
я дам правильный шаг, пока вы не нажмете, если вы в этом состоянии (фиксация отсоединена). отсоединенное означает, что ваша фиксация не связана ни с какими ветвями, она связана только с состоянием «отсоединенная голова».
Сначала вы должны создать новую ветку, отсоединенный коммит будет автоматически связан с новой веткой.
git branch temporaryWork
И перейдите к оформлению заказа, чтобы освоить, чтобы вы могли объединить эту «temporaryWork». Пожалуйста, проверьте список названий веток, чтобы избежать ошибок
git checkout master
git merge temporaryWork
И git скажет, что ваш файл может конфликтовать, вернитесь к своему текстовому редактору кода и удалите код, который вам не нужен.
И зафиксируйте это изменение
git add .
git commit -am "merging temporaryWork"
затем удалите "temporaryWork"
get branch -d temporaryWork
и закинуть на гитхаб.
git push origin master
Легкое решение - просто создать новую ветку для этого коммита и оформить заказ: git checkout -b <branch-name> <commit-hash>
,
Таким образом, все сделанные вами изменения будут сохранены в этой ветке. В случае, если вам нужно очистить ветку master от оставшихся коммитов, обязательно запустите git reset --hard master
,
При этом вы будете переписывать свои ветки, поэтому не мешайте никому с этими изменениями. Обязательно ознакомьтесь с этой статьей для лучшей иллюстрации состояния отключенного HEAD.
Когда я выполнил проверку, ведущую к оторванной голове, git фактически сказал мне, что делать в таком случае:
git switch -c \<new-branchname>
Результат оставляет мастер, как и до отсоединения головы, и новую ветку, содержащую все коммиты, сделанные во время работы в состоянии отсоединенной головы.
Чтобы воспроизвести / протестировать / понять более подробно:
- создание testrepo с двумя коммитами:
~/gittest$ git log --oneline 17c34c0 (HEAD -> master) 2 5975930 1
- проверить предыдущую фиксацию 1
~/gittest$ git checkout 5975930
Появляется это немецкое сообщение
Ссылка: Wechsle zu '5975930'.
Sie befinden sich im Zustand eines 'losgelösten HEAD'. Sie können sich umschauen, Experimentelle Änderungen vornehmen und diese committen, und Sie können alle möglichen Commits, die Sie in diesem Zustand machen, ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie zu einechselnderen Branch.
Венн Сиэйнен Нойен Филиал erstellen möchten, um Ihre erstelltenCommits zu behavior, können Sie das (jetzt oder später) durch Nutzungvon 'switch' mit der Option -c tun. Beispiel:
git switch -c \<neuer-Branchname>
Oder um diese Operation rückgängig zu machen: git switch -
Sie können diesen Hinweis ausschalten, indem Sie dieKonfigurationsvariable 'advice.detachedHead' auf 'false' setzen.
HEAD ist jetzt bei 5975930 1
что переводится на английский как:
Примечание: измените на 5975930.
Вы находитесь в состоянии «отстраненной ГОЛОВЫ». Вы можете осмотреться, внести экспериментальные изменения и зафиксировать их, и вы можете отказаться от любых возможных коммитов, которые вы делаете в этом состоянии, не затрагивая никакую ветку, переключившись на другую ветку.
Если вы хотите создать новую ветку, чтобы сохранить созданные коммиты, вы можете сделать это (сейчас или позже), используя 'switch' с параметром -c. Пример:
git switch -c <new-branch-name>.
Или чтобы отменить эту операцию: git switch -.
Вы можете отключить эту подсказку, установив для переменной конфигурации advice.detachedHead значение false.
HEAD сейчас на 5975930 1
(Переведено с www.DeepL.com/Translator (бесплатная версия))
Возможно, не лучшее решение (перепишет историю), но вы также можете сделать git reset --hard <hash of detached head commit>
,
Я также основал статью, где объясняется, как обрабатывать. Я добавляю это, потому что это немного отличается от того, что было предложено. Но я думаю, что все предложения действительны
http://edspencer.net/2009/10/git-what-to-do-if-you-commit-to-no-branch.html
Позже я приму первый ответ как хороший