Git push nic nie da (wszystko jest aktualne)


105

Próbuję zaktualizować repozytorium Git na GitHub. Zrobiłem kilka zmian, dodałem je, popełniłem, a potem próbowałem zrobić git push. Odpowiedź mówi mi, że wszystko jest aktualne, ale najwyraźniej tak nie jest.

git remote show origin

odpowie z repozytorium, którego oczekiwałem.

Dlaczego Git informuje mnie, że repozytorium jest aktualne, skoro istnieją lokalne zatwierdzenia, które nie są widoczne w repozytorium?

  [searchgraph]  git status
# On branch develop
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       Capfile
#       config/deploy.rb
nothing added to commit but untracked files present (use "git add" to track)

  [searchgraph]  git add .

  [searchgraph]  git status
# On branch develop
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   Capfile
#       new file:   config/deploy.rb
#

  [searchgraph]  git commit -m "Added Capistrano deployment"
[develop 12e8af7] Added Capistrano deployment
 2 files changed, 26 insertions(+), 0 deletions(-)
 create mode 100644 Capfile
 create mode 100644 config/deploy.rb

  [searchgraph]  git push
Everything up-to-date

  [searchgraph]  git status
# On branch develop
nothing to commit (working directory clean)

Upewnij się również, że pchasz do właściwej gałęzi.
Brian

Odpowiedzi:


145

git pushnie wypycha wszystkich oddziałów lokalnych: skąd ma wiedzieć, do których oddziałów zdalnych je przekazać? Wypycha tylko lokalne gałęzie, które zostały skonfigurowane do wypychania do określonej gałęzi zdalnej.

W mojej wersji Gita (1.6.5.3) po uruchomieniu git remote show originwypisuje, które gałęzie są skonfigurowane do wypychania:

Local refs configured for 'git push':
  master pushes to master (up to date)
  quux   pushes to quux   (fast forwardable)

P: Ale mógłbym naciskać, masternie martwiąc się o to wszystko!

Kiedy ty git clone, domyślnie ustawia twoją lokalną mastergałąź do wypychania do mastergałęzi zdalnego (lokalnie określanej jako origin/master), więc jeśli tylko zatwierdzisz master, to prosty git pushzawsze odrzuci twoje zmiany z powrotem.

Jednak z opublikowanego przez Ciebie fragmentu danych wyjściowych znajdujesz się w gałęzi o nazwie develop, która, jak sądzę, nie została skonfigurowana do wysyłania niczego. Więcgit push bez argumentów nie będzie wypychać zatwierdzeń w tej gałęzi.

Kiedy jest napisane „Wszystko aktualne”, oznacza to, że „wszystkie gałęzie, które mi powiedziałeś, są aktualne”.

P: Jak więc mogę pushować moje zmiany?

Jeśli chcesz wprowadzić zmiany z developdo origin/master, prawdopodobnie powinieneś scalić je z lokalnym, mastera następnie wypchnąć:

git checkout master
git merge develop
git push             # will push 'master'

Jeśli chcesz utworzyć developgałąź na zdalnym, oddzielnym od master, to podaj argumenty do git push:

git push origin develop

To spowoduje: utworzenie nowej gałęzi na zdalnym wywołaniu develop; i zaktualizuj ten developoddział w lokalnym oddziale; i zestaw developdo pchania się origin/developwięc, że w przyszłości, git pushbez argumenty będą naciskaćdevelop automatycznie.

Jeśli chcesz wypchnąć swój lokalny lokal developdo zdalnego oddziału o nazwie innej niż develop , możesz powiedzieć:

git push origin develop:something-else

Jednak, że forma nie będzie skonfigurować develop, aby zawsze naciskać aby origin/something-elsew przyszłości; to jednorazowa operacja.


Wielkie dzięki, twoje pochodzenie git push się rozwija: coś innego dało odpowiedź na pytanie, na które nie mogłem się dostać przez jakiś czas.
Antroid

1
W moim przypadku git push origin xnadal nie ustawiałem gałęzi x do wypchnięcia w przyszłości. Było to spowodowane specyficzną pushspec w .gitconfig [remote "origin"]sekcji, która powodowała zachowanie gita.
Raman

Używając tylko git push originmiałem ten problem, używając twojego przykładu git push origin developi dostosowując go do mojej głównej gałęzi, git push origin masterproblem został rozwiązany, dzięki
FantomX1

28

Zdarzyło mi się to, gdy moja aplikacja SourceTree uległa awarii podczas przemieszczania. W wierszu poleceń wydawało się, że poprzedni git addzostał uszkodzony. W takim przypadku spróbuj:

git init
git add -A
git commit -m 'Fix bad repo'
git push

Przy ostatnim poleceniu może być konieczne ustawienie gałęzi.

git push --all origin master

Pamiętaj, że to wystarczy, jeśli nie wykonałeś żadnego rozgałęziania ani żadnego podobnego. W takim przypadku upewnij się, że naciskasz na właściwą gałąź, na przykład git push origin develop.


15

Próbować:

git push --all origin

powoduje to popychanie zatwierdzeń do oddzielania gałęzi w repozytorium, a nie z jednej gałęzi do głównej.
Sreedevi J

13

Spróbuj przejść do ostatniego zatwierdzenia, a następnie zrób git push origin HEAD:master.


1
To faktycznie zadziałało. Czy chciałbyś wyjaśnić, dlaczego to zadziałało?
René Nyffenegger

Tekstowo z dokumentów:Push the current branch to the remote ref matching master in the origin repository. This form is convenient to push the current branch without thinking about its local name.
uruapanmexicansong

U mnie też
działał

Porównałem konfigurację mojego repozytorium i wszystkie gałęzie wyglądały tak samo. Jednak w jednej gałęzi nie mogłem po prostu użyć git push: / To pracował dla mnie, a także: git push origin HEAD:my_branch_name.
iaforek

6

W moim przypadku żadne inne rozwiązanie nie zadziałało. Musiałem zrobić kopię zapasową nowych zmodyfikowanych plików (pokazanych z git status) i uruchomić plik git reset --hard. Pozwoliło mi to na ponowne dopasowanie do zdalnego serwera. Dodawanie nowych zmodyfikowanych plików i uruchamianie

git add .
git commit -am "my comment"
git push

Zrobiłem sztuczkę. Mam nadzieję, że to komuś pomoże, jako rozwiązanie „ostatniej szansy”.


4

W tej chwili wygląda na to, że jesteś w gałęzi deweloperskiej. Czy masz rozwiniętą gałąź na swoim pochodzeniu? Jeśli nie, spróbuj git push origin develop. git pushzadziała, gdy dowie się o rozwijającej się gałęzi w Twoim pochodzeniu.

W trakcie dalszej lektury zajrzałbym do stron podręcznika man git-push , w szczególności do sekcji przykładów.


4

Mówiąc konkretnie, jeśli chcesz scalić coś do masteringu, możesz wykonać poniższe kroki.

git add --all // If you want to stage all changes other options also available
git commit -m "Your commit message"
git push // By default when it clone is sets your origin to master or you would have set sometime with git push -u origin master.

Jest to powszechna praktyka w modelu żądania ściągnięcia, aby utworzyć nową gałąź lokalną, a następnie wypchnąć tę gałąź do zdalnego. W tym celu musisz wspomnieć, gdzie chcesz zdalnie przesłać zmiany. Możesz to zrobić, wspominając o zdalnym w momencie naciśnięcia.

git push origin develop // It will create a remote branch with name "develop".

Jeśli chcesz utworzyć gałąź inną niż nazwa twojego oddziału lokalnego, możesz to zrobić za pomocą następującego polecenia.

git push origin develop:some-other-name

2

Dzięki Samowi Stokesowi. Zgodnie z jego odpowiedzią możesz rozwiązać problem w inny sposób (ja użyłem w ten sposób). Po zaktualizowaniu katalogu deweloperskiego należy go ponownie zainicjować

git init

Następnie możesz zatwierdzać i przesyłać aktualizacje do mastera


1
Dzięki! W moim przypadku wpisz: git initi otwórz nową kartę poleceń, wpisz:git push origin branch_name
s7ven

2

Zdarzyło mi się to, gdy byłem ^Cw środku a git pushdo GitHub. GitHub nie pokazał jednak, że zmiany zostały wprowadzone.

Aby to naprawić, dokonałem zmiany w moim drzewie roboczym, zatwierdziłem i ponownie nacisnąłem. Działało doskonale.


2

To mi się przydarzyło. Po prostu ponownie zatwierdziłem zmiany, a potem nacisnąłem.


2

Próbowałem wielu metod, w tym zdefiniowanych tutaj. Co mam to

  • Upewnij się, że nazwa repozytorium jest prawidłowa. Najlepszym sposobem jest skopiowanie linku z repozytorium i wklejenie go w git bash.

  • Upewnij się, że zatwierdziłeś wybrane pliki.

    git commit -m "Your commit here"
    
  • Jeśli oba kroki nie działają, spróbuj

    git push -u -f origin master


1

Zamiast tego możesz spróbować wykonać następujące czynności. Nie musisz iść do master; możesz bezpośrednio wymusić wprowadzenie zmian z samej gałęzi.

Jak wyjaśniono powyżej, dokonując rebase, zmieniasz historię swojego oddziału. W rezultacie, jeśli spróbujesz zrobić coś normalnego git pushpo rebase'u, Git odrzuci to, ponieważ nie ma bezpośredniej ścieżki od zatwierdzenia na serwerze do zatwierdzenia w twojej gałęzi. Zamiast tego musisz użyć flagi -flub, --forceaby powiedzieć Gitowi, że tak, naprawdę wiesz, co robisz. Podczas wykonywania wymuszonych pchnięć zdecydowanie zaleca się push.defaultustawienie prostego ustawienia konfiguracji, co jest wartością domyślną w Git 2.0. Aby upewnić się, że konfiguracja jest poprawna, uruchom:

$ git config --global push.default simple

Gdy wszystko będzie poprawne, możesz po prostu uruchomić:

$ git push -f

I sprawdź swoje żądanie pull. Powinien zostać zaktualizowany!

Aby uzyskać więcej informacji, przejdź do dolnej części Jak ponownie wykonać żądanie ściągnięcia .


0

Zdarzyło mi się to, gdy próbowałem wypchnąć z nowej gałęzi i git push origin masterzamiast tego użyłem . Powinieneś albo:

  • Użyj: git push origin your_new_branchjeśli chcesz, aby ta gałąź wystąpiła również w zdalnym repozytorium.
  • W przeciwnym razie sprawdź w swojej gałęzi głównej, scalaj rzeczy, a następnie przesuń z mastera do git repo za pomocą git merge origin master.

Podsumowując: chodzi o to, że powinieneś sprawdzić, gdzie oferujesz drugi parametr dla git merge. Więc jeśli jesteś w głównym, użyj wzorca jako drugiego parametru, jeśli jesteś w nowej_gałęzie, użyj tego jako drugiego parametru, jeśli chcesz zachować tę gałąź w zdalnym repozytorium, w przeciwnym razie wybierz drugą opcję powyżej.



-6
git push origin master

Nie wiem, dlaczego tak wiele złych głosów, właśnie to działało dla mnie git push origin master, sam git push origin udaje, że działa, ale nie zadziałał, kto wie, czy ustawienie upstreamu czy coś też by pomogło
FantomX1
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.