Dlaczego nie mogę wcisnąć pustego zatwierdzenia?

35
  git commit --amend --allow-empty

następnie

  git push origin master

dupek tak powiedział

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'remoteurl'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Czemu? Jak to naprawić?


źródło

Odpowiedzi:

56

Problemem nie jest to, że wypychasz puste zatwierdzenie.
Chodzi o wypchnięcie innego zatwierdzenia (tego z innym SHA1) niż zatwierdzenie już wypchnięte.
Oto, co git commit --amendrobi: zmodyfikował ostatni zatwierdzenie, nie tworzy nowego.

Oznacza to, że przesuwasz inną historię niż ta, którą inni już sklonowali.
Jeśli masz pewność, że nie będzie to problemem, musisz wymusić wypchnięcie:

git push -f origin master

Czy powinieneś to zrobić:

git commit --allow-empty

Utworzyłbyś nowe (puste) zatwierdzenie, które mógłbyś wypchnąć bez żadnego problemu.

VonC
źródło
5

Jeśli chcesz utworzyć żądanie ściągnięcia na Github. Możesz:

git commit --allow-empty -m "make pull request"

Następnie utwórz żądanie ściągnięcia bez zmian.

1 Rhino
źródło
3

Aby wyjaśnić przyjętą odpowiedź, ponieważ nie mam wystarczającej reputacji, aby móc komentować:

Kiedy używasz

git commit --amend

to robi utworzyć nowy popełnić. Jednak nie dołącza go do bieżącego zatwierdzenia, ale dołącza do elementu nadrzędnego bieżącego zatwierdzenia. Wizualnie wyglądałby jak widelec.

  O (old commit)
 /
O-O (amended commit)

Git interpretuje to jako rozbieżność z pilotem. Dlatego nie pozwoli ci to popychać bez zmuszania.

Dustin
źródło
0

Upewnij się, że zdalny oddział, do którego próbujesz wcisnąć, nie jest obecnie wyewidencjonowany. Zrobiłem kiedyś repozytorium git na jednym z moich serwerów i nie mogłem zrozumieć, dlaczego nie mogłem do niego naciskać. Po około dniu rozwiązywania problemów dowiedziałem się, że nie mogę przesłać do repozytorium (lub do gałęzi, którą chciałem), gdy jest ono wyewidencjonowane w repozytorium serwera. Tak więc po prostu utworzyłem nowy oddział, który kasuję, gdy skończę wprowadzać zmiany na serwerze, a następnie mogę przesyłać dalej na serwer. To może nie być twój problem, ale dostałem błąd podobny do tego, kiedy miałem problem z wypychaniem pustego gita na moim serwerze.

PRaven
źródło