Robię git bisect
i po dojściu do problematycznego zatwierdzenia, próbuję teraz zrobić krok do przodu / do tyłu, aby upewnić się, że jestem w tym właściwym.
Wiem o HEAD^
cofnięciu się w historii, ale czy istnieje inny skrót, który poprowadzi mnie naprzód (w kierunku konkretnego zobowiązania w przyszłości), na przykład:
A - B - C(HEAD) - D - E - F
Wiem, że mój cel jest F i chcę przejść z C do D .
UWAGA: to nie jest duplikat Git: Jak poruszać się w tę iz powrotem między zatwierdzeniami , moje pytanie jest nieco inne i nie ma tam odpowiedzi
git checkout -b new_branch HEAD~4
cofnąć 4 zatwierdzenia z HEAD, jak w stackoverflow.com/a/4940090/911945Odpowiedzi:
Trochę poeksperymentowałem i wydaje się, że to wystarcza, aby przejść do przodu ( edycja : działa dobrze tylko wtedy, gdy masz liniową historię bez zatwierdzeń scalania):
gdzie
towards
jest SHA1 zatwierdzenia lub tagu.Wyjaśnienie:
$()
oznacza: pobierz wszystkie zatwierdzenia między aktualnymHEAD
atowards
zatwierdzeniem (z wyłączeniemHEAD
) i sortuj je w kolejności pierwszeństwa (tak jakgit log
domyślnie - zamiast kolejności chronologicznej, która jest dziwnie domyślnarev-list
), a następnie weź ostatnią (tail
), czyli ten, do którego chcemy się udać.git checkout
do wykonania pobrania.Możesz zdefiniować funkcję dostępną jako alias oczekujący parametrów w twoim
.profile
pliku, aby przejść do konkretnego zatwierdzenia:źródło
git log
pokazuje rewizje w porządku chronologicznym, domyślnie tak samo, jakrev-list
, z wyjątkiem użycia--graph
flagi.Wszystko, czego potrzebujesz, aby uzyskać jasny, nie odłączony stan głowy, to zresetować, a nie zapłacić.
źródło
git reset "HEAD@{1}"
w niektórych muszlach, takich jak fish i powershell ..git reflog
może być również przydatne do znalezienia prawidłowego zatwierdzenia.git reset HEAD
cofnąłem się do miejsca, w którym byłem ... teraz nie mam pojęcia, w jakim stanie jest moje repozytorium i wszystko jest przerażające. Co mam teraz zrobić?Wierzę, że możesz:
Aby przejść o jedno zobowiązanie do przodu w czasie. Aby przejść do wielu zatwierdzeń, użyj HEAD @ {2}, HEAD @ {3} itd.
źródło
To jest to, czego używam do nawigacji tam iz powrotem.
przejście do następnego zatwierdzenia
przejście do poprzedniego zatwierdzenia
źródło
git checkout <current branch>
do ostatniego commita.git checkout -b <new-branch-name>
od bieżącego zatwierdzenia umożliwia zmiany w nowej gałęzi.git rebase -i
również działa. Ponadto nazwałem swojąn()
funkcję,nx()
aby uniknąć konfliktu z menedżerem wersji węzła „n”. Koniecznie sprawdź aliasy!Powiedz F jest najnowszym zatwierdzeniem
trunk
(wstaw tutaj własną nazwę gałęzi) ... możesz nazywać gotrunk~0
(lub po prostutrunk
), E astrunk~1
, D astrunk~2
itd.Spójrz na swój reflog, aby poznać więcej sposobów nazywania zmian.
źródło
F
i że wiesz, gdzie w historii tej gałęzi chcesz się przenieść. Nie próbuje poruszać się do przodu w stosunku do HEAD, ale mniej do tyłu w stosunku do tułowia.trunk~2
A?trunk
i twój prądHEAD
są identyczne, co nie jest pokazane w pytaniu, które, jak stwierdziłem, nie jest tym, co zakładam, i jest bardzo mało prawdopodobne w połowiebisect
Przechodzenie do tyłu jest trywialne, ponieważ poruszasz się w dół drzewa, a zawsze jest jedna droga
Przechodząc do przodu, poruszasz się w górę drzewa, więc musisz dokładnie określić, do której gałęzi celujesz:
Zastosowanie:
git down
,git up <branch-name>
źródło
HEAD^
jest to zwykle rozsądne niewykonanie zobowiązania.Jeśli chcesz patrzeć w przyszłość, możesz zrobić tę sztuczkę, ponieważ Git nie ma do tego ścisłych poleceń.
Przykład
Lista skrótów historii logów:
za pomocą polecenia
git log --reverse C..
, na wyjściu pojawi się B i A .źródło
Prawdopodobnie nie jest to najprzyjemniejszy sposób, ale możesz użyć,
git log
aby wyświetlić listę zatwierdzeń, a następnie użyć,git checkout [sha1 of D]
aby przejść do D.źródło
Właśnie zrobiłem test na tym. powiedz na przykład, że jesteś w gałęzi głównej Następnie wykonaj:
Głowa zostaje odłączona i możesz spróbować ponownie, aby przejść do innego zatwierdzenia:
Kiedy skończysz się rozglądać, możesz wrócić do pierwotnego stanu, po prostu sprawdzając tę gałąź. W moim przykładzie: master branch
Jeśli nie chcesz przejść do pierwotnego stanu i chcesz zachować jedno ze zatwierdzeń jako głowę i kontynuować od tego momentu, musisz rozgałęzić się stamtąd. na przykład po „git checkout HEAD @ {4}” możesz wystawić
źródło
Aby obejść ten problem, możesz po prostu wrócić do HEAD za pomocą
A następnie przejdź do zmiany, którą chcesz, za pomocą
źródło
Jeśli używasz kodu vs code, to historia Git jest niesamowitą wtyczką, w której możesz efektywnie przeglądać zatwierdzenia i sprawdzać ich zawartość w samym edytorze. sprawdź link
źródło
gdzie:
branchName
równa się nazwie gałęzicommitInOrder
równa się zatwierdzeniu w kolejności od pierwszego zatwierdzenia w wybranej gałęzi (więc 1 to pierwszy zatwierdzenie, 2 to drugie zatwierdzenie w gałęzi itp.)źródło