Kiedy trochę popracowałem z moim kodem źródłowym, zrobiłem swoje zwykłe zatwierdzenie, a następnie wypchnąłem do zdalnego repozytorium. Ale potem zauważyłem, że zapomniałem zorganizować import w kodzie źródłowym. Więc wykonuję polecenie zmiany, aby zastąpić poprzednie zatwierdzenie:
> git commit --amend
Niestety zatwierdzenia nie można wypchnąć z powrotem do repozytorium. Jest odrzucany w następujący sposób:
> git push origin
To //my.remote.repo.com/stuff.git/
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'
Co powinienem zrobić? (Mogę uzyskać dostęp do zdalnego repozytorium).
git
git-commit
amend
Łup
źródło
źródło
git push -force
ostrożniej .Odpowiedzi:
Właściwie kiedyś naciskałem
--force
i.git
repozytorium i zostałem skarcony przez Linusa DUŻY CZAS . Zasadniczo spowoduje to wiele problemów dla innych ludzi. Prosta odpowiedź brzmi „nie rób tego”.W każdym razie widzę, że inni podali taki przepis, więc nie będę ich tutaj powtarzał. Ale oto wskazówka, jak wyjść z sytuacji po wypchnięciu zmienionego zatwierdzenia za pomocą --force (lub + master).
git reflog
aby znaleźć stare zatwierdzenie, które zmieniłeś (zadzwońold
, a my wywołamy nowe zatwierdzenie, które utworzyłeś, zmieniającnew
).old
inew
, rejestrując drzewonew
, lubićgit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Wtedy ludzie, którzy niefortunne wystarczy mieć opiera swoją pracę na zatwierdzenie ty zatarte poprzez zmianę i zmuszając push ujrzy otrzymany seryjnej będzie widać, że faworyzuje
new
sięold
. Ich późniejsze fuzje nie spowodują konfliktów między nimiold
inew
wynikają z twoich poprawek, więc nie będą musiały cierpieć.źródło
git reflog
go znaleźćWidzisz funkcję bezpieczeństwa Git. Git nie chce zaktualizować gałęzi zdalnej za pomocą gałęzi, ponieważ zatwierdzenie główne gałęzi nie jest bezpośrednim potomkiem bieżącego zatwierdzenia głównego gałęzi, do której użytkownik naciska.
Gdyby tak nie było, dwie osoby pchające do tego samego repozytorium mniej więcej w tym samym czasie nie wiedziałyby, że nadchodzi nowy zatwierdzenie w tym samym czasie i ktokolwiek nacisnąłby ostatni, straciłby pracę poprzedniego popychacza bez żadnego z zdają sobie z tego sprawę.
Jeśli wiesz, że jesteś jedyną osobą, która pcha i chcesz wypchnąć zmienione zatwierdzenie lub wypchnąć zatwierdzenie, które wycofuje gałąź, możesz „zmusić” Gita do zaktualizowania zdalnej gałęzi za pomocą
-f
przełącznika.Nawet to może nie działać, ponieważ Git zezwala zdalnym repozytoriom na odrzucanie wypychania na drugim końcu za pomocą zmiennej konfiguracyjnej
receive.denynonfastforwards
. W takim przypadku przyczyna odrzucenia będzie wyglądać następująco (zwróć uwagę na część „odrzucenie zdalne”):Aby obejść ten problem, musisz zmienić konfigurację zdalnego repozytorium lub jako brudny hack możesz usunąć i ponownie utworzyć gałąź w ten sposób:
Zasadniczo ostatni parametr, który
git push
korzysta z formatu<local_ref>:<remote_ref>
, gdzielocal_ref
jest nazwą gałęzi w lokalnym repozytorium iremote_ref
nazwą gałęzi w zdalnym repozytorium. Ta para poleceń używa dwóch skrótów.:master
ma zerowy parametr local_ref, co oznacza wypchnięcie gałęzi null na stronę zdalnąmaster
, tj. usunięcie gałęzi zdalnej. Nazwa oddziału w żadnym:
wypadku nie wypycha gałęzi lokalnej o podanej nazwie do oddziału zdalnego o tej samej nazwie.master
w tej sytuacji jest skrótemmaster:master
.źródło
git gc
czasu ponownego rejestrowania stare obiekty zostaną przycięte. Nikt, kto klonuje repozytorium, nie otrzyma żadnych obiektów, które nie są już dostępne, gdy tylko gałąź zostanie zaktualizowana.Szybki rant: fakt, że nikt nie opublikował tutaj prostej odpowiedzi, świadczy o desperackiej wrogości wobec użytkownika przejawianej przez interfejs Git CLI.
W każdym razie „oczywistym” sposobem na zrobienie tego, zakładając, że nie próbowałeś wymusić nacisku, jest pociągnięcie w pierwszej kolejności. To pociąga za sobą zmianę, którą poprawiłeś (a więc już nie masz), abyś miał ją ponownie.
Po rozwiązaniu konfliktów możesz ponownie naciskać.
Więc:
Jeśli podczas ściągania wystąpią błędy, być może coś jest nie tak z konfiguracją twojego lokalnego repozytorium (miałem złe referencje w sekcji gałęzi .git / config).
I po
Może dostaniesz dodatkowe zatwierdzenie z tematem opowiadającym o „Trywialnym scaleniu”.
źródło
git push -f
lubgit reset
jest to jedyna droga, aby tu dotrzeć.Krótka odpowiedź: Nie wypychaj poprawionych zmian do publicznego repozytorium.
Długa odpowiedź: kilka poleceń Gita, takich jak
git commit --amend
igit rebase
, faktycznie przepisuję wykres historii. Jest to w porządku, o ile nie opublikowałeś swoich zmian, ale kiedy już to zrobisz, naprawdę nie powinieneś grzebać w historii, ponieważ jeśli ktoś już dostał twoje zmiany, to kiedy spróbują je ponownie pobrać, może się nie powieść . Zamiast zmieniać zatwierdzenie, powinieneś po prostu dokonać nowego zatwierdzenia ze zmianami.Jednakże, jeśli naprawdę naprawdę chcesz wcisnąć zmienione zatwierdzenie, możesz to zrobić w następujący sposób:
+
Znak wiodący zmusi do wypchnięcia, nawet jeśli nie spowoduje zatwierdzenia „przewijania do przodu”. (Szybkie zatwierdzanie do przodu występuje, gdy zmiany, które przesyłasz, są bezpośrednimi potomkami zmian już zawartych w publicznym repozytorium).źródło
git push -f
.Oto bardzo prosty i czysty sposób na wprowadzenie zmian po dokonaniu
commit --amend
:Który wykonuje następujące czynności:
Pamiętaj, aby zmienić „origin” i „master”, jeśli zastosujesz to do innej gałęzi lub pilota.
źródło
git add
przed zatwierdzeniem, aby uwzględnić zmiany.git reset --soft "HEAD^"
. Reszta działa dobrze.Rozwiązałem go, odrzucając moje zmienione lokalne zatwierdzenie i dodając nowe zmiany na górze:
źródło
Miałem ten sam problem.
Jako początkujący Git myślałem, że to kompletny FUBAR .
Rozwiązanie: W pewnym sensie @bara zasugerował + utworzenie lokalnego oddziału kopii zapasowych
Może nie jest to szybkie i czyste rozwiązanie i straciłem historię (1 zatwierdzenie zamiast 5), ale zaoszczędziłem dzień pracy.
źródło
Jeśli nie przekazałeś kodu do zdalnej gałęzi (GitHub / Bitbucket), możesz zmienić komunikat zatwierdzenia w wierszu poleceń, jak poniżej.
Jeśli pracujesz nad konkretnym oddziałem, wykonaj następujące czynności:
Jeśli kod został już przesłany z niewłaściwą wiadomością, należy zachować ostrożność podczas zmiany wiadomości. tzn. po zmianie komunikatu zatwierdzenia i ponownym wypchnięciu go, masz problemy. Aby zapewnić płynność, wykonaj następujące czynności.
Przeczytaj całą odpowiedź, zanim to zrobisz
Ważna uwaga: użycie bezpośredniego wymuszania może spowodować problemy z kodem, które inni programiści pracują nad tym samym oddziałem. Aby uniknąć tych konfliktów, musisz wyciągnąć kod z gałęzi, zanim wymusisz wypchnięcie :
Jest to najlepsza praktyka przy zmianie komunikatu zatwierdzenia, jeśli został już wypchnięty.
źródło
--force
, zobacz przyjętą odpowiedźJeśli wiesz, że nikt nie wyciągnął twojego niezmienionego zatwierdzenia, skorzystaj z
--force-with-lease
opcjigit push
.W TortoiseGit możesz zrobić to samo w opcjach „Push ...” „Force: May discard” i zaznaczając „znane zmiany”.
źródło
Otrzymujesz ten błąd, ponieważ zdalny Git ma już te pliki zatwierdzeń. Musisz wymusić wypchnięcie gałęzi, aby to zadziałało:
Upewnij się również, że ściągnąłeś kod zdalnie, ponieważ ktoś z twojego zespołu mógł pchnąć do tego samego oddziału.
Jest to jeden z przypadków, w których musimy wymusić wypchnięcie zatwierdzenia na odległość.
źródło
Oto bardzo prosty i czysty sposób na wprowadzenie zmian po dokonaniu już
git add "your files"
igit commit --amend
:lub:
źródło
Musiałem rozwiązać ten problem podczas pobierania ze zdalnego repo i radzenia sobie z konfliktami scalania, które powstały, zatwierdzenia, a następnie wypchnięcia. Ale wydaje mi się, że istnieje lepszy sposób.
źródło
Po prostu robiłem to, co Git mi powiedział. Więc:
Uwaga: Zmienione zatwierdzenie było najnowsze.
źródło
Poniższe działało dla mnie przy zmianie autora i osoby zatwierdzającej zatwierdzenie.
git push -f origin master
Git był na tyle sprytny, by stwierdzić, że były to zatwierdzone identyczne delty, które różniły się tylko sekcją metainformacyjną.
Zarówno lokalni, jak i zdalni szefowie wskazywali na przedmiotowe zobowiązania.
źródło
Jeśli korzystasz z programu Visual Studio Code, możesz wypróbować to rozszerzenie, aby to ułatwić.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
Jak można zrozumieć po nazwie, wykonuje polecenia kolejno
git commit --amend
git push --force
źródło
Tutaj, jak naprawiłem edycję w poprzednim zatwierdzeniu:
git stash
teraz kopia robocza jest czysta w stanie ostatniego zatwierdzenia.git commit --all --amend
Twój edytor pojawi się z prośbą o komunikat dziennika (domyślnie stary komunikat dziennika). Zapisz i zamknij edytor, gdy będziesz z niego zadowolony.
Nowe zmiany są dodawane do starego zatwierdzenia. Przekonaj się za pomocą
git log
igit diff HEAD^
Ponownie zastosuj ukryte zmiany, jeśli zostały wprowadzone:
git stash apply
źródło