Co zrobić z zatwierdzeniem dokonanym w odłączonej głowie

279

Za pomocą git zrobiłem coś takiego

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)

Ponieważ powiedziało mi, że wciąż mogę popełnić błąd, gdy jestem w stanie oderwanej głowy, więc to zrobiłem. Ale teraz chcę polubić moją odłączoną gałąź główną i moją lokalną gałąź główną, a następnie przesłać moją grupę zmian do origin / master.

Więc moje pytanie brzmi: jak mogę połączyć gałąź master z moim faktycznym stanem (odłączona głowa)

benzen
źródło
możliwy duplikat Git: HEAD zniknął, chcę scalić go w mistrza
Karl Bielefeldt
Mógłbym dodać zrzut ekranu drzewa zatwierdzeń w tym stanie (jak faktycznie wygląda zatwierdzenie na odłączonej głowie w gitk lub SourceTree), co uczyniłoby to pytanie jeszcze lepszym.
florisla
Niestety w tej chwili nie mogę, ale jeśli dasz radę, z przyjemnością zobaczę to tutaj. Nawet jeśli to musi być remis, to wszystko
wyjaśni

Odpowiedzi:

476

Utwórz gałąź, w której jesteś, a następnie przełącz się na master i scal ją:

git branch my-temporary-work
git checkout master
git merge my-temporary-work
Ryan Stewart
źródło
12
Jak można uniknąć odłączania głów w przyszłości?
ycomp
Zrobiłem to i znalazłem się przed początkiem 5 zobowiązań. W takim razie po prostu robisz git push origin?
Winnemucca,
5
dziwne, dostaję komunikat „Już aktualny”. podczas łączenia mojej pracy tymczasowej
Robert Sinclair
10
Nie zapomnij usunąć mojej tymczasowej pracy za pomocą „git branch -d mojej tymczasowej pracy”
Captain Lepton
5
@ycomp „odłączona głowa” dzieje się, gdy edytujesz pliki starego zatwierdzenia, a następnie zatwierdzasz je bez oddziału, aby później odwoływać się do tego nowego zatwierdzenia Aby uniknąć odłączenia głowy, nie sprawdzaj starych zatwierdzeń. Jeśli nadal chcesz wszystkie pliki stamtąd, ale jako nowy zatwierdzenie, możesz pobrać katalog z zatwierdzenia, zamiast samego zatwierdzenia. Zobacz tę odpowiedź
lucidbrot,
96

Możesz zrobić coś takiego.

# 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

Byłoby jeszcze prostsze

git checkout master
git merge HEAD@{1}

ale ma to niewielkie niebezpieczeństwo, że jeśli popełnisz błąd, może być nieco trudniej odzyskać zmiany popełnione na odłączonej głowie.

CB Bailey
źródło
4
Wiem, że to lata później, ale dziękuję za tę odpowiedź. Nie uważałem się za szukanie z zaakceptowaną odpowiedzią tutaj, ponieważ nie chciałem opuszczać tymczasowej gałęzi, a ta odpowiedź zawiera polecenie jej usunięcia.
Jeremy Pridemore
8
Jeśli zdecydujesz się użyć polecenia git merge HEAD@{1}, prawdopodobnie powinieneś upewnić się, że jest to to, którego chcesz użyćgit reflog
Michael Stramel
3
Możliwość scalenia HEAD @ {1} uratowała mi życie, ponieważ wcześniej zapobiegawczo sprawdziłem mistrza.
juil
dziwne, dostaję komunikat „Już aktualny”. podczas łączenia tmp (ale pliki są inne)
Robert Sinclair
18

Oto co zrobiłem:

Zasadniczo pomyśl o detached HEADnowej gałęzi bez nazwy. Możesz zatwierdzić w tej gałęzi, tak jak każdą inną gałąź. Po zakończeniu zatwierdzania chcesz przekazać go do pilota.

Pierwszą rzeczą, którą musisz zrobić, to nadać temu detached HEADnazwę. Możesz to zrobić w prosty sposób detached HEAD:

git checkout -b some-new-branch

Teraz możesz przekazać go zdalnie, jak każdej innej gałęzi.

W moim przypadku chciałem również przewinąć tę gałąź do przodu, aby opanować wraz z zatwierdzeniami dokonanymi w detached HEAD(teraz some-new-branch). Wszystko co zrobiłem to

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

Oczywiście później to połączyłem master.

O to chodzi.

Bhushan
źródło
1
Ta odpowiedź działała dla mnie, gdzie inni nie. git checkout -b new-branchpracował dla mnie. Inne sugestie wymagały git branch new-branch, ale to pozostawiło mnie w bezruchu, a nowy oddział nie zauważył moich zmian.
Jesse Patel
17

Możesz po prostu zrobić git merge <commit-number>lubgit cherry-pick <commit> <commit> ...

Zgodnie z sugestią Ryana Stewarta możesz również utworzyć gałąź z bieżącego HEAD:

git branch brand-name

Lub po prostu tag:

git tag tag-name
Arnaud Le Blanc
źródło
Możesz znaleźć swój numer zatwierdzenia na odłączonej głowie przezgit rev-parse HEAD
KOGI
6

W przypadku odłączonego HEAD, zatwierdzenia działają normalnie, tyle że żaden nazwany oddział nie jest aktualizowany. Aby zaktualizować gałąź główną z zatwierdzonymi zmianami, utwórz gałąź tymczasową tam, gdzie jesteś (w ten sposób gałąź tymczasowa będzie miała wszystkie zatwierdzone zmiany, które wprowadziłeś w odłączonym HEAD), następnie przełącz się na gałąź główną i połącz gałąź tymczasową z mistrz.

git branch  temp
git checkout master
git merge temp
Razan Paul
źródło
3

Prostym rozwiązaniem jest po prostu stworzyć nową gałąź do tego zobowiązać i kasę do niego: git checkout -b <branch-name> <commit-hash>.

W ten sposób wszystkie wprowadzone zmiany zostaną zapisane w tej gałęzi. W razie potrzeby wyczyszczenia gałęzi master z resztek zatwierdzeń, należy uruchomić git reset --hard master.

Dzięki temu będziesz przepisywać swoje oddziały, więc nie przeszkadzaj nikomu tymi zmianami. Zapoznaj się z tym artykułem, aby lepiej zilustrować odłączony stan HEAD .

Nesha Zoric
źródło
1

Może nie jest to najlepsze rozwiązanie (przepisze historię), ale możesz też git reset --hard <hash of detached head commit>.

rekrut
źródło