W tekście zadań do wykonania mam następujące informacje git rebase -i HEAD~2
:
pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link
# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...
Teraz, gdy próbuję zgnieść pierwszą ( 56bcce7
) i wybrać drugą, dodając „s” przed pierwszą, pojawia się następujący błąd:
Cannot 'squash' without a previous commit
Czy ktoś może mi wyjaśnić, co to znaczy i jak mam to zrobić?
Chcę zmiażdżyć pierwsze zatwierdzenie ( 56bcce7
) i „wybrać i przeredagować” drugie ( e43ceba
) zatwierdzenie
Odpowiedzi:
Interaktywna rebase przedstawia zatwierdzenia w odwrotnej kolejności niż ta, do której jesteś przyzwyczajony podczas używania
git log
.git rebase -i
odtwarza wybrane zatwierdzenia w dokładnej (od góry do dołu) kolejności, w jakiej są wymienione w zapisanym pliku instrukcji rebase. Podczas zgniatania zatwierdzenie wybrane do zgniatania jest łączone z zatwierdzeniem, które go poprzedza na (edytowanej) liście, tj. Zatwierdzeniem z poprzedniego wiersza. W twoim przypadku - nie ma wcześniejszego zatwierdzenia dla56bcce7
. Musisz wykonać jedną z następujących czynnościgit rebase -i HEAD~3
(jeśli chcesz, aby zgnieść56bcce7
w684f917
)Jeśli masz zamiar łączyć się
56bcce7
z nimie43ceba
ie43ceba
nie są od nich zależne56bcce7
, po prostu zmień ich kolejność:AKTUALIZACJA : Odpowiedź Gusa poniżej sugeruje lepszy sposób zrobienia tego samego, bez zmiany kolejności dwóch zatwierdzeń:
Spowoduje to zgniecenie / połączenie dwóch zatwierdzeń w jedno. Gdy interaktywna rebase poprosi o przeformułowany komunikat o zatwierdzeniu dla
56bcce7
, podaj komunikat o zatwierdzeniu, który opisuje unię56bcce7
ie43ceba
.źródło
56bcce7
we43ceba
. Jak więc wykonać tutaj krok 1?Miałem podobny problem, który rozwiązałem w następujący sposób:
Oto grupa commitów, którą chciałem zgnieść:
Jak widać, nie chciałem. 4, ale 1, 2 i 3 nie miały wcześniejszego zobowiązania do zgniatania . Stąd nie można „zmiażdżyć” bez poprzedniego błędu zatwierdzenia .
Moim rozwiązaniem było skorzystanie z
r
opcji for# r, reword = use commit, but edit the commit message
Więc moja lista commits wyglądała tak:
Po zapisaniu interaktywna powłoka poprosiła mnie o przeformułowanie wybranego zatwierdzenia.
Po tym mój dziennik zatwierdzeń spowodował pojedyncze zatwierdzenie, co spowodowało czystszą historię zmian.
źródło
git rebase --edit-todo
i naprawić odsyłanie do tej odpowiedzi, a następnie zrobićgit rebase --continue
Miałem ten problem i powodem, dla którego tak się stało w moim przypadku, było to, że nie możesz zmiażdżyć starszych zatwierdzeń do nowego zatwierdzenia. Oto przykład, z którego wynika, że masz 3 zatwierdzenia:
Teraz, jeśli powiesz
git rebase -i HEAD~3
i zrobisz coś takiegoSpowoduje to błąd:
Rozwiązanie :
Podczas zgniatania zatwierdzeń powinieneś zgniatać ostatnie zatwierdzenia do starych, a nie odwrotnie, więc w przykładzie będzie to mniej więcej tak:
To zadziała dobrze, o ile chcesz wszystkie swoje komunikaty o zmianach, sugerowałbym naprawę zamiast squasha .
źródło
Squash z logiką odwrotną . W późniejszym kroku będziesz mógł wybrać żądany komunikat dotyczący zmiany.
pick
pierwszy zatwierdzenie , dla którego nie chcesz, aby komunikat o zatwierdzeniu.squash
lubfixup
zmiany, które chcesz scalić, aż do tego, który zawiera komunikat o zmianach, którego faktycznie chciałeś.:x
)Lint.py: Replace deprecated link
:).:x
)Mam nadzieję, że to dla kogoś jaśniejsze ✌🏽
źródło
Najlepiej będzie po prostu powiedzieć w interaktywnym edytorze zawierającym zatwierdzenia, git zawsze zgniata się od dołu do góry i należy zostawić wpis „wybierz” u góry, aby otrzymać squashy od dołu.
źródło
Właśnie wypróbowałem to podejście.
To pokaże ostatnie 3 commity, które dadzą mi wyobrażenie o tym, co jest ostatnim zatwierdzeniem, a które zostało wykonane wcześniej. Teraz stwierdzone zmiany bazy,
Wybierz ostatnie zatwierdzenie, na szczycie którego musimy zmiażdżyć pozostałe dwa. Identyfikator zatwierdzenia, który jest wybrany jako zatwierdzenie podstawowe, wyglądałby następująco:
W przypadku dwóch pozostałych zatwierdzeń zmień je na,
lub po prostu,
źródło
Ja też spotkałem się z tym problemem właśnie teraz, to jest po prostu nieostrożne. Możesz rozwiązać problem jak następny: kiedy spróbujesz zgnieść pierwszy (56bcce7) i wybierzesz drugi, powinieneś dodać „s” przed drugą linią, ale nie pierwszy. możesz również odwołać się do następnej witryny internetowej: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html
źródło