Ratowanie plików i zatwierdzeń z „no branch” w git

11

Zacząłem pracować nad niektórymi plikami, które miałem w podmodule git w ramach innego projektu. Ponieważ jednak był to podmoduł git, nigdy nie wypisał „master”, a zamiast tego po prostu wypisał nagłówek i umieścił wszystkie pliki w folderze w „no branch”.

Teraz, gdy przez przypadek wprowadziłem kilka zmian w tych plikach, właśnie zdałem sobie sprawę, że pracuję w podmodule mojego projektu „bez gałęzi”.

Jak przenieść te pliki do oddziału (np. Master), aby móc je uratować?

Xeoncross
źródło

Odpowiedzi:

28

Możesz użyć, git reflogaby znaleźć „utracone” zatwierdzenia:

$ cd submodule_dir
$ git reflog          # Find the commit
$ git checkout master
$ git cherry-pick $SHA_OF_MISSING_CMMIT
mipadi
źródło
Tak, to działało świetnie! z wyjątkiem tego, że zrobiłem to git merge $COMMIT_SHAraz, gdy byłem w innej gałęzi.
Xeoncross,
3

Stan „bez rozgałęzienia” nazywany jest odłączonym HEAD. Nazywa się to, ponieważ odwołanie HEAD nie jest dołączone do żadnej gałęzi, zamiast tego wskazuje bezpośrednio na zatwierdzenie. Aby dołączyć HEAD do gałęzi, która wskazuje na bieżące zatwierdzenie HEAD, użyj git checkout -b branchname.

Możesz bezpiecznie zaktualizować istniejący oddział, aby uwzględnić zatwierdzenia w HEAD w następującej sekwencji:

git branch temp
git checkout branchname
git merge temp
git branch -d temp

Lub, równoważnie, używając notacji reflog, HEAD@{1}aby uniknąć konieczności tworzenia gałęzi tymczasowej:

git checkout branchname
git merge HEAD@{1}

Korzystanie z gałęzi tymczasowej byłoby dobrym pomysłem, jeśli nie zamierzasz wykonywać scalania natychmiast.

Jeśli chcesz wymusić zastąpienie istniejącej gałęzi, aby wskazać zatwierdzenie w HEAD, którego możesz użyć git branch -f branchname && git checkout branchname. Jeśli zatwierdzenie w HEAD nie jest oparte na bieżącej końcówce nazwy gałęzi, spowoduje to szybką zmianę nazwy gałęzi, której zwykle chcesz unikać (jest to postrzegane jako historia przepisywania).

Chris Johnsen
źródło
Zauważ, że ta odpowiedź zakłada, że ​​HEAD wciąż wskazuje ostatnie zatwierdzenie, którego nie było na gałęzi. Jeśli przeniosłeś HEAD od tego czasu i dopiero teraz zdałeś sobie sprawę z tego, co się stało, być może będziesz musiał poszukać tego utraconego zatwierdzenia w logu (patrz odpowiedź mipadi).
LarsH
1

Aby dodać do poprzednich odpowiedzi:

Gdy nadal masz odłączony HEAD, możesz dodać tag:

git tag <some-tag>

Spowoduje to dodanie tagu do zatwierdzenia, dzięki czemu będzie widoczny w gitkinnych narzędziach.

dane
źródło