2012-03-23 14 views
54

Wiem, że ludzie zadawali podobne pytania, ale uważam, że przyczyny ich problemów były inne. Zrobiłem twardy reset bo miałem pomieszane mój kod całkiem złegit push odrzucony: błąd: nie udało się przeforsować niektórych informacji.

git reset --hard 41651df8fc9 

Zrobiłem sporo zmian, zrobiłem kilka zobowiązuje i teraz, że próbuję naciskać wszystkie te zobowiązuje się do serwera pojawia się następujący błąd:

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

Git sugeruje zrobić pull git i to, co inni ludzie sugerują innym użytkownikom. Wierzę jednak, że ciąg git połączy mój obecny kod z kodem, którego już nie chcę (wersja główna). Jak mogę wypchnąć i zapomnieć o wersji/wersjach przede mną?

Odpowiedz

90

git push -f jeśli masz pozwolenie, ale to zepsuje każdego, kto wycofa się z tego repo, więc bądź ostrożny.

Jeśli zostanie odrzucona, a masz dostęp do serwera, jak canzar mówi poniżej, można to pozwolić na serwerze z

git config receive.denyNonFastForwards false 
+0

Chyba nie masz uprawnień „remote : error: odmawianie nie szybkiego przewijania/head/master (powinieneś ciągnąć pierwszy) "Jestem jedyną osobą pracującą na tym repo w tej chwili, więc nie martwię się o żadne inne gałęzie czy coś takiego. Jakieś pomysły? – Eric

+0

Jeśli jesteś jedyną osobą posiadającą to repozytorium, po prostu użyj 'git push -f', który użyje twojego bieżącego repo zastąpić zdalny. Jeśli istnieje rozwój wielu użytkowników, szybkie uruchamianie jest niezbędne, w przeciwnym razie bardzo łatwo stanie się niesmakiem. – Tim

+1

Jeśli możesz zalogować się na pilocie, możesz przejść bezpośrednio do gołego repozytorium git i ręcznie przewinąć gałąź, używając na przykład 'git branch -f', np.' Git branch -f rewind_the_one_I_broke 8120307'. Możesz uruchomić 'git log' w nagim repozycie, aby znaleźć punkt resetowania. Zauważ, że ma to taki sam efekt jak 'git push -f', ale omija haki. – torek

23

Jeśli jesteś tylko osoba pracująca nad projektem, co można zrobić to:

git checkout master 
git push origin +HEAD 

Spowoduje to ustawienie końcówki pochodzenia/pana do tego samego popełnić jako master (a więc usunąć zobowiązuje między 41651df i pochodzenia/Master)

+0

Czy to pozbędzie się kodu, którego już nie chcę i zachowa mój nowy kod? (przepraszam, jeśli to głupia odpowiedź) – Eric

+2

to ustawi koniec pochodzenia/wzorzec dla tego samego zatwierdzenia, co wzorzec (i tak usunie zatwierdzenia między 41651df a początkiem/wzorcem) – ouah

+0

Zaktualizuj główny oddział repozytorium początkowego z bieżącą lokalizacją HEAD oddział, umożliwiając aktualizacje nie-szybkie do przodu. Tak samo jest z 'git push HEAD -f'. Dla mnie, myślę, możesz użyć bardziej delikatnego sposobu, aby to zrobić, najpierw użyj 'git fetch', a następnie użyj' git rebase -i origin/master', to pozwoli ci wybrać zatwierdzenia. – Tim

4

'remote: error: denying non-fast-forward refs/heads/master (you should pull first)'

Ta wiadomość sugeruje, że istnieje hak na serwerze, który odrzuca szybkie popychania do przodu. Tak, zazwyczaj nie jest to zalecane i jest dobrą ochroną, ale ponieważ jesteś jedyną osobą, która go używa i chcesz wykonać wymuszenie, skontaktuj się z administratorem repo, aby zezwolić na nieszybkie przesuwanie, tymczasowo usuwając hak lub udzielając pozwolenia w haku, aby to zrobić.

+1

Albo, niech administrator uruchomi 'git branch -f', który ma ten sam efekt, ale nie wymaga kłopotów z hakiem pre-receive. – torek

10

Wystarczy zrobić

git pull origin [branch] 

a następnie powinny być w stanie wcisnąć.

Jeśli masz rewizje na własną rękę i nie naciskać go jeszcze oddział, spróbuj

git pull --rebase origin [branch] 

a następnie powinny być w stanie wcisnąć.

0

Co zrobiłem, aby rozwiązać ten problem był następujący:

git pull origin [branch] 
git push origin [branch] 

także upewnić się, że są skierowane do właściwego oddziału uruchamiając:

git remote set-url origin [url] 
Powiązane problemy