Wydaje mi się, że to pytanie było zadawane wiele razy, ale zazwyczaj jest to rozwiązanie: „Usunąłem katalog i ponownie wykonałem pracę z nowym wyewidencjonowaniem”. Wykonałem zatwierdzenie i naciśnięcie, ale zdałem sobie sprawę, że odniosłem się do niewłaściwego numeru biletu w komunikacie dotyczącym zatwierdzenia. Poszukałem więc szybkiego rozwiązania w SO i skończyło się na wpisaniu w terminalu:
$ git reset --soft HEAD^
$ git commit -m "... correct message ..."
Jedynym problemem jest to, że otrzymuję następujący komunikat o błędzie:
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Używam modelu git-flow i pracuję nad gałęzią deweloperską. Jak mogę ponownie scalić rzeczy, aby ponownie uszczęśliwić gita?
git
version-control
rynmrtn
źródło
źródło
Odpowiedzi:
Siła
git push
:źródło
receive.denyNonFastForwards
w odpowiedzi Brian Campbell :+
albo--force
może nie być wystarczająco energiczne, w zależności od sposobu ich kimkolwiek oni są, zostały skonfigurowane swoje repozytorium git.Jeśli naciśniesz commit do serwera, a następnie przepisać że popełniania lokalnie (z
git reset
,git rebase
,git filter-branch
lub jakiejkolwiek innej manipulacji historii), a następnie popchnął że przepisany popełnić powrotem do serwera, można zepsuć nikogo, kto pociągnął. Oto przykład; powiedz, że popełniłeś A i wypchnąłeś go na serwer.Teraz decydujesz się przepisać A w sposób, o którym wspomniałeś, resetując i ponownie zatwierdzając. Zauważ, że pozostawia to wiszące zatwierdzenie, A, które ostatecznie zostanie zebrane jako śmieci, ponieważ nie jest osiągalne.
Jeśli ktoś inny, powiedzmy Fred, ściągnie
master
serwer z serwera, kiedy to robisz, będzie miał odniesienie do A, od którego może zacząć pracę:Teraz, gdybyś był w stanie popchnąć swoje A 'do początku / końca, co spowodowałoby szybkie przewijanie do przodu, nie miałoby ono A w swojej historii. Więc jeśli Fred spróbuje ponownie pociągnąć, musiałby nagle scalić i ponownie wprowadzić zatwierdzenie A:
Jeśli Fred zdarzy się, że to zauważy, może wykonać rebase, co uniemożliwi ponowne pojawienie się zatwierdzenia A. Ale musiałby to zauważyć i pamiętać, żeby to zrobić; a jeśli masz więcej niż jedną osobę, która ściągnęła A, wszyscy musieliby zmienić bazę, aby uniknąć dodatkowego zatwierdzenia A w drzewie.
Więc generalnie nie jest dobrym pomysłem zmienianie historii w repozytorium, z którego korzystają inni ludzie. Jeśli jednak wiesz, że nikt inny nie wyciąga z tego repozytorium (na przykład jest to twoje własne prywatne repozytorium lub masz tylko jednego programistę pracującego nad projektem, z którym możesz łatwo koordynować), możesz wymusić aktualizacja poprzez uruchomienie:
lub
Obaj zignorują sprawdzanie, czy nie ma szybkiego przewijania do przodu, i zaktualizują zawartość serwera do nowej wersji A ', porzucając wersję A, aby ostatecznie została usunięta.
Możliwe, że wymuszenie wypychania jest całkowicie wyłączone za pomocą
receive.denyNonFastForwards
opcji konfiguracji. Ta opcja jest domyślnie włączona w repozytoriach współdzielonych. W takim przypadku, jeśli naprawdę chcesz wymusić wypychanie, najlepszą opcją jest usunięcie gałęzi i ponowne utworzenie jej za pomocągit push origin :master; git push origin master:master
. JednakdenyNonFastForwards
opcja jest włączona nie bez powodu, który opisano powyżej; na współdzielonym repozytorium oznacza to, że teraz każdy, kto go używa, musi upewnić się, że bazuje na nowej historii.W repozytorium współużytkowanym generalnie lepiej jest po prostu wypchnąć nowe zatwierdzenia, które naprawią każdy problem; możesz użyć
git revert
do wygenerowania zatwierdzeń, które cofną zmiany poprzednich zatwierdzeń.źródło
+develop
komendę - więc czek trafia do niego. I tak masz astronomiczną liczbę punktów: Pgit push --force
receive.denyNonFastForwards
opcji config. Ta opcja jest domyślnie włączona w repozytoriach współdzielonych. W takim przypadku, jeśli naprawdę chcesz wymusić wypychanie, najlepszą opcją jest usunięcie gałęzi i ponowne utworzenie jej za pomocągit push origin :remote_A; git push origin local_A:remote_A
. Ale przeczytaj to, co napisałem powyżej, o tym, dlaczego wykonywanie tego rodzaju przepływu pracy we współdzielonym repozytorium jest złym pomysłem. Powinieneś spróbować to zrobić tylko wtedy, gdy masz coś, co powoduje poważne problemy w zatwierdzeniu, którego próbujesz się pozbyć lub przepisać.Być może będziesz musiał zrobić
git pull
, co MOŻE automatycznie scalić elementy za Ciebie. Następnie możesz ponownie zatwierdzić. Jeśli masz konflikty, wyświetli się monit o ich rozwiązanie.Pamiętaj, że musisz określić, z której gałęzi chcesz pobierać, jeśli nie zaktualizowałeś gitconfig, aby określić ...
Na przykład:
źródło
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)Używałem EGit i napotkałem również ten problem. Właśnie spróbowałem do
rebase
bieżącej gałęzi i zadziałało.źródło