2009-09-25 15 views
9

Próbowałem wciskam (pierwszy w historii!) Git repo jak to początkowo:Dlaczego "git push helloworld + master: master" zamiast tylko "git push helloworld"?

$ git push helloworld 

Ale mam ten powrotem:

To [email protected]:helloworld.git 
! [rejected]  HEAD -> master (non-fast forward) error: 
failed to push some refs to '[email protected]:helloworld 
git' 

więc znalazłem another StackOverflow question o "zmienionych zobowiązuje" i próbowałem sugestia nie wiedząc, czy to mi pomoże:

[email protected] /c/test/helloworld (master) 
$ git push helloworld +master:master 

Zadziałało!

Ale nie wiem, dlaczego to naprawić mój problem :(

Może ktoś wyjaśnić, dlaczego to działa, ale „git push helloworld” nie?

+1

Dodano inne rozwiązanie w odpowiedzi na Twój komentarz. – VonC

Odpowiedz

18

Wydaje został przepisany historii (SHA-1 wiąże się ze swoimi popełniają) w gałęzi master

oznacza to, że nie można już przesunąć w trybie fast-forward

przycisk + siłami opanować impuls do podjęcia miejsce:..
by z opcjonalnym prowadzeniem +, możesz powiedzieć git, aby zaktualizować ref <dst>, nawet jeśli aktualizacja nie jest szybkim przejściem do przodu.

Uwaga: może to być złe, jeśli ktoś jeszcze sklonował twoje repozytorium, ponieważ nie będzie już w stanie po prostu wyciągnąć głównej gałęzi bez konfliktu.
Zobacz także ten SO answer for more.


Uwaga: jak wspomniano by Junio C. Hamano:

Istnieją dwa niezależne mechanizmy bezpieczeństwa:

  • wysyłanie bezpieczeństwo końcowy może być zastąpione przez "git push --force" i/lub za pomocą refspec z prefiksem z "+");

  • Bezpieczeństwo końcowego odbiorcy może zostać zmienione przez zmienną konfiguracyjną receive.denynonfastworwards repozytorium, do którego wepchnąłeś.

ostatnie domyślnie „niebezpieczne”, ale jeśli bezpieczeństwa jest aktywowany w repozytorium zmuszając od strony wysyłającej nie wyłączy się. IOW, oba końce muszą zgodzić się na dopuszczenie niebezpiecznych zachowań.


Jak wspomniano w Git FAQ, możliwym sposobem działania jest:

Najbardziej prawdopodobnym powodem jest to, że trzeba wyciągnąć z pilota jako pierwszy. Możesz zobaczyć, jakie zmiany ma strona zdalna, najpierw pobierając, a następnie sprawdzając rejestr.Na przykład,

$ git fetch origin 
$ git log master..origin/master 

będzie lista wszystkich zmian zdalny bocznego, że strona nie jest. Jeśli chcesz graficzną reprezentację, użyj gitk --left-right master...origin/master.
Strzałki po lewej stronie to zmiany, które chcesz nacisnąć, strzałki po prawej stronie oznaczają zmiany po stronie zdalnej.

Inne rozwiązanie (co właśnie zrobiłeś):

$ git push origin +branchname 

To wymusi aktualizację. Jeśli nie masz uprawnień, to czasami to będzie działać:

$ git push origin :branchname 
$ git push origin +branchname 

czyli usunąć zdalnie pierwszy oddział (często jest to dozwolone), a następnie ponownie wcisnąć „nowe” (albo przewijany).

Należy pamiętać, że jeśli zwiniesz gałęzie, inni mogą mieć problem z pociągnięciem.
Istnieje szansa, że ​​połączą się w oddziale, który pobrali z nowym, który opublikowałeś, skutecznie zachowując zmiany, których próbujesz się pozbyć.
Jednak to tylko ich kopie będą miały złe wersje. Z tego powodu przewijanie gałęzi jest uważane za łagodnie antyspołeczne. Niemniej jednak często jest to właściwe.

+0

To jest prywatne repozytorium git tylko po to, aby nauczyć się lin - więc nie martwię się konfliktami z innymi. Chciałbym usunąć to repozytorium i zrobić to poprawnie następnym razem. Co powinienem zrobić zamiast "+ master: master" po otrzymaniu wiadomości "[odrzucone]"? –

+0

To było to. Dziękuję bardzo! Poprawiłem go od nowa, ale tym razem zrobiłem pierwszy i zadziałało. Cóż za dziwne dziwactwo! W Mercurial nigdy nie musiałem robić czegoś takiego, kiedy tworzę nowy projekt. –

+0

hg push ma flagę siły z tego samego powodu. Jeśli zmienisz historię (przez mq lub cokolwiek innego), będziesz musiał wymusić to pchnięcie. – Dustin

Powiązane problemy