git push mówi „wszystko na bieżąco”, mimo że mam lokalne zmiany

238

Mam zdalny serwer gitosis i lokalne repozytorium git i za każdym razem, gdy dokonam dużej zmiany w kodzie, wypchnę te zmiany również na ten serwer.

Ale dzisiaj stwierdzam, że chociaż mam pewne lokalne zmiany i zobowiązuję się do lokalnego repozytorium, po uruchomieniu git push origin mastermówi „Wszystko aktualne”, ale kiedy używam git clonedo pobierania plików na zdalnym serwerze, nie zawiera najnowszych zmian . I mam tylko jedną gałąź o nazwie „master” i jeden zdalny serwer o nazwie „origin”.

PS: To właśnie wyświetla git podczas uruchamiania ls-remote, nie jestem pewien, czy to pomaga

$ git ls-remote origin
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
$ git ls-remote .
49c2cb46b9e798247898afdb079e76e40c9f77ea        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/remotes/origin/master
3a04c3ea9b81252b0626b760f0a7766b81652c0c        refs/tags/stage3
ZelluX
źródło
Warto dokładnie sprawdzić, czy masz odpowiedni katalog! Esp. kiedy masz podmoduły, możesz pomylić odpowiedzi git od rodzica ...
geotheory
W moim przypadku wystąpił błąd, commitktórego nie zauważyłem i próbowałem wypchnąć kod
Zohab Ali
3
zapomniałeś popełnić?
ldgorman

Odpowiedzi:

256

Czy przypadkiem pracujesz z odłączoną głową ?

Jak w:

odłączona głowa

wskazując, że twoje ostatnie zatwierdzenie nie jest szefem oddziału.

Ostrzeżenie : git reset --hardwykonaj następujące czynności : pamiętaj, aby użyć git stashnajpierw, jeśli chcesz zapisać aktualnie zmodyfikowane pliki.

$ git log -1
# note the SHA-1 of latest commit
$ git checkout master
# reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Jak wspomniano na git checkoutstronie manuala (moje podkreślenie):

Czasami przydaje się możliwość sprawdzenia zatwierdzenia, które nie znajduje się na końcu jednej z twoich gałęzi .
Najbardziej oczywistym przykładem jest sprawdzenie zatwierdzenia w oznakowanym oficjalnym punkcie wydania, takim jak ten:

$ git checkout v2.6.18

Wcześniejsze wersje git nie pozwalały na to i poprosiły cię o utworzenie tymczasowej gałęzi za pomocą -bopcji, ale od wersji 1.5.0 powyższe polecenie odłącza twoją HEADgałąź od bieżącej gałęzi i bezpośrednio wskazuje na zatwierdzenie nazwane przez tag ( v2.6.18w przykład powyżej).

W tym stanie możesz używać wszystkich poleceń git.
Możesz git reset --hard $othercommitna przykład użyć do dalszego poruszania się.
Możesz wprowadzić zmiany i utworzyć nowy zatwierdzenie na odłączonym HEAD .
Możesz nawet utworzyć scalenie za pomocą git merge $othercommit.

Stan, w którym się znajdujesz, gdy HEAD jest odłączony, nie jest rejestrowany przez żadną gałąź (co jest naturalne - nie ma żadnej gałęzi).
Oznacza to, że możesz odrzucić swoje tymczasowe zatwierdzenia i scalenia, przełączając się z powrotem do istniejącego oddziału (np. git checkout master), A później git prunelub git gcby je wyrzucać .
Jeśli zrobiłeś to przez pomyłkę, możesz poprosić o rejestrację w HEAD, gdzie byłeś, np

$ git log -g -2 HEAD
VonC
źródło
4
Nie jest dla mnie do końca jasne, w jaki sposób znalazłem się w tym stanie (w tej chwili robię trochę pieprzenia z git-svn), ale to wystarczyło, aby wrócić do właściwego miejsca. Dzięki.
Christopher Schmidt
Jestem w stanie odłączonej głowy, połączyłem swoje zmiany, zatwierdziłem swoje zmiany, a teraz chcę przekazać to Mistrzowi i nie mogę - mówi mi „wszystko na bieżąco”. Ale postępuję zgodnie z instrukcjami podanymi przez moją Gitlab: Step 1: git fetch origin git checkout -b "nodeAPI" "origin/nodeAPI" Step 2. Review the changes locally Step 3. Merge and fix conflicts git fetch origin git checkout "origin/master" git merge --no-ff "nodeAPI" Step 4. Push the result of the merge to GitLab git push origin "master" Jestem dobry do ostatniego kroku. Ale teraz jestem tylko zdezorientowany, jak iść naprzód.
Jan
@John Musisz być w oddziale, aby pchać. Tak długo, jak jesteś w odłączonym trybie HEAD, to nie działałoby. Zresetuj swój oddział do miejsca, w którym się znajdujesz: git branch -f myBranch HEADa następnie sprawdź wymieniony oddział i wciśnij go. W twoim przypadku myBranchmoże być mastertak, jakbyś był w trakcie łączenia nodeAPI.
VonC
Uważaj na utratę wszystkich lokalnych zmian po uruchomieniu tego polecenia !! Zastanów się nad zrobieniem kopii zapasowej skrytki i kodu przed zrobieniem czegoś takiego.
kta
@kta Dobra uwaga: Zredagowałem odpowiedź, aby ostrzeżenie było widoczne.
VCC
152

Err .. Jeśli jesteś git noob, czy na pewno masz go git commitwcześniej git push? Popełniłem ten błąd po raz pierwszy!

Laz
źródło
10
To było git commit -a -m "your message goes here"w moim przypadku
aexl
KOCHAM (sarkazm) za każdym razem, gdy chcę dodać nowy projekt do github, czasami zapominam, a komunikat o błędzie prowadzi mnie do wniosku, że zrobiłem coś naprawdę złego - wtedy oczywiście DUH! zatwierdzenie Zdarza mi się tylko wtedy, gdy
tworzę
git noob tutaj - zapomniałem popełnić każdy cholerny czas przed pchnięciem - pchanie powinno automatycznie zatwierdzić, jeśli jeszcze tego nie zrobiłeś
FoxMcCloud
2
@FoxMcCloud popełnienia jest ważnym krokiem na drodze do być świadomy, jestem pewien, że można nauczyć się ją kochać, jeśli nie masz już :) ~ git add -A, git diff --staged, przewija się przez zmiany hmm patrząc bardzo dobry git commit -m 'bam!',git push
AFOC
58

Może naciskasz na nowy oddział lokalny?

Nowy oddział lokalny musi zostać jawnie przekazany:

git push origin your-new-branch-name

Tylko jedna z tych rzeczy na temat git ... Klonujesz repozytorium, tworzysz gałąź, dokonujesz zmian, pchasz ... „Wszystko jest aktualne”. Rozumiem, dlaczego tak się dzieje, ale ten przepływ pracy jest wyjątkowo nieprzyjazny dla nowych użytkowników.

Roman Starkov
źródło
3
Dzięki! To naprawiło mój problem „wszystko na bieżąco” z nowym oddziałem, który miałem
Pangu
Co do cholery oznacza „twoja nowa gałąź”? Ps: Masz rację co do przybyszów.
www-0av-Com
@ user1863152 to nazwa nowego lokalnego oddziału, który utworzyłeś. Wygląda na to, że tego nie zrobiłeś, więc sprawdź inne odpowiedzi tutaj.
Roman Starkov
Całkowicie zgadzam się z „ten przepływ pracy jest wyjątkowo nieprzyjazny dla nowych użytkowników”. Walczę z tym od 1 godziny. Konfiguruję repozytorium zdalne i lokalne. Dokonano zmian w lokalnym pliku REAME i spróbuj przekazać go do zdalnego i nic się nie zmienia w zdalnym.
Vir
28

Inna sytuacja, o której należy pamiętać: Domyślnym stanem git jest to, że pracujesz w gałęzi „master”. I w wielu sytuacjach po prostu spędzasz czas jako główny działający oddział (chociaż niektórzy ludzie lubią robić inne rzeczy).

W każdym razie to tylko jedna gałąź. Tak więc sytuacja, do której mogę się dostać to:

Moja aktywna gałąź nie jest tak naprawdę gałęzią główną. ... Ale zwykle wykonuję polecenie: git push(i zrobiłem to wcześniej git push origin master, więc jest to skrót do tego).

Więc zwykle wypycham gałąź master do wspólnego repo ... co jest prawdopodobnie dobrą, czystą rzeczą, w moim przypadku ...

Ale zapomniałem, że zmiany, nad którymi pracowałem, nie są jeszcze w gałęzi master !!!

Dlatego za każdym razem, gdy próbuję git pushi widzę „Wszystko na bieżąco”, chcę krzyczeć, ale oczywiście to nie wina Gita! To jest moje.

Zamiast tego łączę moją gałąź w mistrza, a następnie pcham i wszystko znów jest szczęśliwe.

Chris Burbridge
źródło
Chciałem też krzyczeć, ale wtedy głosiłeś ścieżkę zbawienia, aby połączyć brant w mistrza, a potem git push.
Aaron C
16
$ git push origin local_branch:remote_branch

Wyjaśnienie

Miałem ten sam błąd i spędziłem godziny próbując go rozgryźć. Nareszcie to znalazłem. Nie wiedziałem jednak, że takie wypychanie git push origin branch-xbędzie próbowało szukać gałęzi x lokalnie, a następnie wypchnięcie do zdalnej gałęzi x.

W moim przypadku miałem dwa odległe adresy URL. Zrobiłem kasę z gałęzi-x do gałęzi-y , próbując wypchnąć lokalnie z y do zdalnego x. Miałem wiadomość, że wszystko jest aktualne, co jest normalne, ponieważ przesuwałem do x drugiego zdalnego.

Krótko mówiąc, aby nie wpaść w tego rodzaju pułapki, musisz podać referencję źródłową i docelową:

$ git push origin local_branch:remote_branch

Aktualizacja:

Jeśli musisz uruchamiać to polecenie za każdym razem, gdy wypychasz oddział, być może będziesz musiał ustawić upstream między oddziałem lokalnym i zdalnym za pomocą:

$ git push --set-upstream origin local_branch:remote_branch

Lub

$ git push -u origin local_branch:remote_branch
Melchia
źródło
„git push upstream dev: master” Oznacza to, że będzie przekazywał źródła z dev do master. Dobrze?
Dhaduk Mitesh
Pomogło mi to, miałem inny oddział lokalny o nazwie oddział zdalny, co spowodowało zamieszanie.
Hubert Kubiak
Ok, to zdecydowanie działa dla mnie, ale muszę to robić za każdym razem, gdy chcę coś przekazać do pilota. Jak to naprawić raz na zawsze?
SamuraiJack,
być może trzeba ustawić upstream między lokalnym i zdalnym oddziałem za pomocą: $ git push --set-upstream origin local_branch: remote_branch
Melchia
6

Zobacz odpowiedź VonC powyżej - potrzebowałem dodatkowego kroku:

$ git log -1
- note the SHA-1 of latest commit
$ git checkout master
- reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

Zrobiłem to, ale kiedy spróbowałem git push remoterepo master, powiedział: „błąd: nie udało się wypchnąć niektórych referencji. Aby zapobiec utracie historii, aktualizacje niezwiązane z przewijaniem do przodu zostały odrzucone, Scal zdalne zmiany (np.„ Git pull ”) przed pchanie ponownie. ”

Więc zrobiłem „git pull remoterepo master” i znalazłem konflikt. Zrobiłem to git reset --hard <commit-id>ponownie, skopiowałem skonfliktowane pliki do folderu kopii zapasowej, zrobiłem git pull remoterepo masterponownie, skopiowałem pliki z powrotem do mojego projektu, zrobiłem git committo git push remoterepo masteri tym razem zadziałało.

Git przestał mówić „wszystko jest aktualne” - i przestał narzekać na „szybkie przewijanie”.

rodmclaughlin
źródło
3

Miałem podobną sytuację; kiedy wprowadzałem zmiany i starałem się git push origin master, mówiłem, że wszystko jest aktualne.

git addPotem musiałem zmienić plik git push origin master. Od tego momentu zaczęło działać.

Srikanth Kyatham
źródło
4
Czy nie musiałbyś git commitdodać tego pliku przed wypchnięciem?
David Harkness,
3

Ze swojego statusu gita, prawdopodobnie masz inną sytuację niż moja.

Ale tak czy inaczej, oto co się ze mną stało. Napotkałem następujący błąd:

fatal: The remote end hung up unexpectedly
Everything up-to-date

Bardziej pouczającym komunikatem jest to, że pilot się rozłączył. Okazało się, że jest to spowodowane przekroczeniem rozmiaru bufora postu http. Rozwiązaniem jest zwiększenie go o

git config http.postBuffer 524288000

samwize
źródło
3

Miałem dzisiaj ten problem i nie miało to nic wspólnego z żadną inną odpowiedzią. Oto, co zrobiłem i jak to naprawiłem:

Moje repozytorium zostało niedawno przeniesione, ale miałem lokalną kopię. Odgałęziłem moją lokalną gałąź „master” i wprowadziłem pewne zmiany - a potem przypomniałem sobie, że repozytorium zostało przeniesione. Kiedyś git remote set-url origin https://<my_new_repository_url>ustawiałem nowy adres URL, ale kiedy go wypychałem, po prostu mówiłem „Wszystko na bieżąco” zamiast wypychać moją nową gałąź do opanowania.

Rozwiązałem problem, bazując na, origin/mastera następnie wypychając z wyraźnymi nazwami gałęzi, takimi jak to:

$ git rebase <my_branch> origin/master
$ git push origin <my_branch>

Mam nadzieję, że to pomoże każdemu, kto miał ten sam problem!

Noah
źródło
3

Bardzo rzadkie - ale nadal: w systemie Windows może się zdarzyć, że spakowane referencje mają gałąź z jedną literą (tj. Dev / mybranch), podczas gdy folder refs ma inną wielkość liter (tj. Dev / mybranch), gdy core.ignorecase jest ustawiony na true .

Rozwiązaniem jest ręczne usunięcie odpowiedniego wiersza z zapakowanych referencji . Nie znalazłem czystszego rozwiązania.

Pyrocks
źródło
To też było dla mnie problemem. Skończyło się na zmianie nazw folderów z niepoprawną wielkością liter w folderze .git (logs / refs / heads, refs / heads).
Alexey Solonets,
2

Sam na to wpadłem, kiedy połączyłem oddział na Github i nadal rozwijałem się w nim lokalnie. Moja poprawka była trochę inna niż inne, które zostały zasugerowane.

Najpierw otworzyłem nowy oddział lokalny ze starego, lokalnego oddziału (którego nie mogłem wypchnąć). Następnie wypchnąłem nowy oddział lokalny na serwer źródłowy (Github). To znaczy

$ git checkout -b newlocalbranch oldlocalbranch
$ git push origin newlocalbranch

Dzięki temu zmiany pojawiały się na Githubie, choć w newlocalbranch zamiast oldlocalbranch.

Elliotte Rusty Harold
źródło
2

W moim przypadku miałem 2 zdalne repo.

git remote -v
originhttps https://asim_kt@...
originhttps https://asim_kt@...
origin  ssh:[email protected]:...
origin  ssh:[email protected]:...

Oba repozytorium było takie samo. Tylko jedna była httpsinna ssh. Usunięcie niechcianego (w moim przypadku ssh. Ponieważ użyłem, httpsponieważ sshnie działało!) Naprawiło problem.

Asim KT
źródło
2

Mój błąd był inny niż wszystko do tej pory wspomniane. Jeśli nie masz pojęcia, dlaczego miałbyś odłączoną głowę, prawdopodobnie nie masz. Pracowałem na autopilocie z git commita git push, i nie czytać wyjście z git commit. Okazuje się, że był to komunikat o błędzie, ponieważ zapomniałem -am.

[colin] ~/github/rentap.js [master] M % git commit 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers'
error: pathspec 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers' did not match any file(s) known to git.
[colin] ~/github/rentap.js [master] M % git push
Enter passphrase for key '/home/colin/.ssh/id_ecdsa': 
Everything up-to-date

Naprawiono to, umieszczając miejsce, w -amktórym zwykle robię:

[colin] ~/github/rentap.js [master] M % git commit -am 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers'
Colin Keenan
źródło
2

Napotkałem ten sam problem. Ponieważ nie dodałem zmian w obszarze przeciwności. I bezpośrednio próbowałem przekazać kod do zdalnego repozytorium za pomocą polecenia:

git push origin master

I pokazuje wiadomość Everything up-to-date.

Aby rozwiązać ten problem, spróbuj wykonać następujące czynności

  1. git add .
  2. git commit -m "Bug Fixed"
  3. git push -u origin master
Somyaranjan Rout
źródło
1

Sprawdź, czy nie wygłuszyłeś swojego zdalnego adresu URL.

Chciałem tylko wspomnieć, że wpadłem na to po włączeniu Git jako CVS w lokalnej konfiguracji kompilacji Jenkins. Wygląda na to, że Jenkins sprawdził ostatnie zatwierdzenie gałęzi, którą mu podałem, a także zresetował mojego pilota, aby odpowiadał ścieżkom, które podałem mu do repozytorium. Musiałem ponownie sprawdzić moją gałąź funkcji i naprawić mój zdalny adres źródłowy za pomocą „git remote set-url”. Nie idź wskazując narzędzia do kompilacji do katalogu roboczego, w przeciwnym razie będziesz miał zły czas. Mój pilot był ustawiony na ścieżkę pliku do mojego katalogu roboczego, więc oczywiście zgłaszał wszystko na bieżąco, gdy próbowałem wypchnąć zmiany z tym samym źródłem i miejscem docelowym.

Kyle
źródło
1

Inną możliwością jest nazwanie katalogu w pliku .gitignore, który został wykluczony. Tak więc nowe zatwierdzenia nie zostaną wypchnięte. Zdarzyło mi się, że nazwałem katalog, aby zignorować „szukaj”, ale był to także katalog w moim drzewie źródłowym.

desmond
źródło
1

Znalazłem szybki sposób. Przejdź do folderu .git, otwórz HEADplik i zmień gałąź, którą byłeś z powrotem, na master. Np. Ref:refs/heads/master

widdlepuke
źródło
Właściwie ustawienie go na refs/heads/masterzłamanie mojego repozytorium. Ale ustawienie go do tego, co uważa się za głowę commit dał się następujący komunikat: Warning: you are leaving 1 commit behind, not connected to any of your branches. Byłem w stanie przejąć zatwierdzenie do nowego oddziału i scalić go z powrotem do mistrza.
schmijos
1

Miałem ten sam problem. W moim przypadku było to spowodowane nazwami tego samego pilota. Stworzyło to standardowe „pochodzenie”, ale od dawna używam „github” jako mojego pilota, więc to też tam było. Gdy tylko usunąłem pilota „origin”, błąd zniknął.

Phil Marshall
źródło
1

Tak się stało (zmiany w moim dzienniku git nie były w GitHub, chociaż git powiedział, że wszystko jest aktualne) i jestem pewien, że problemem był Github. Nie dostałem żadnych komunikatów o błędach w git, ale GitHub miał błędy statusu i moje zatwierdzenia były tam kilka godzin później.

https://status.github.com/messages

Komunikaty o stanie GitHub to:

  • Badamy raporty o niedostępności usług.
  • Badamy problemy z dostępem do GitHub.com.
  • Awaria systemu przechowywania danych w celu przywrócenia dostępu do GitHub.com.
użytkownik3827510
źródło
1

Kolejny bardzo prosty, ale noobisty błąd: po prostu zapomniałem dodać -mmodyfikator wiadomości do mojego zatwierdzenia. Więc napisałem:

git commit 'My message'

Zamiast poprawnego:

git commit -m 'My message'

UWAGA: NIE powoduje żadnych błędów! Ale nie będzie w stanie przeforsować swoje rewizje i zawsze Everything up to datezamiast

RWS
źródło
0

tutaj moje rozwiązanie różni się od powyższego. nie zorientowałem się, jak to się dzieje, ale naprawiłem to. trochę niespodziewanie.

teraz nadchodzi sposób:

$ git push origin  use_local_cache_v1
Everything up-to-date
$ git status
On branch test
Your branch is ahead of 'origin/use_local_cache_v1' by 4 commits.
  (use "git push" to publish your local commits)
  ......
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:use_local_cache_v1

To push to the branch of the same name on the remote, use

    git push origin test
    
$ git push origin HEAD:use_local_cache_v1    
Total 0 (delta 0), reused 0 (delta 0)
remote:

polecenie, które działa dla mnie to

$git push origin HEAD:use_local_cache

(Mam nadzieję, że jak najszybciej wyjdziecie z tego problemu)

Reagen
źródło
0

Wiem, że jest super stary, ale w moim przypadku naprawiłem go dość szybko.

Otrzymywałem ten sam błąd, będąc jednym zatwierdzeniem przed master. Potem znalazłem aktualny post przepełnienia stosu. Jednak zanim przejdziemy do sugerowanych pomysłów, postanowiłem po prostu dokonać nowego zatwierdzenia i spróbować ponownie z funkcją push to origin i zadziałało to płynnie.

Nie wiem dlaczego, ale może jest to przydatne dla kogoś innego.

Cisco
źródło
W rzeczywistości nie zapewnia odpowiedzi na pytanie. Gdy zdobędziesz wystarczającą liczbę reputacji , zyskasz uprawnienia do głosowania pozytywnych odpowiedzi . W ten sposób przyszli użytkownicy pytania zobaczą większą liczbę głosów na tę odpowiedź, a osoba odpowiadająca otrzyma również punkty reputacji. Zobacz, dlaczego głosowanie jest ważne .
Waqar UlHaq
1
Ok, dzięki za wyjaśnienie. Ale dlaczego nie można tego uznać (jeśli chcesz) za „obejście” problemu? Nie jest to jednak rozwiązanie, ale i tak może być przydatne dla innych.
Cisco
0

Inną możliwością jest to, że masz zatwierdzenia, które nie wpływają na katalog, który wypychasz. Więc w moim przypadku miałem taką strukturę

- .git
- README.md
- client/
 - package.json
 - example.js
- api/
 - requirements.txt
 - example.py

I zobowiązałem się do modyfikacji README.md, a potem uruchomiłem git subtree push --prefix client heroku-client masteri dostałem wiadomośćEverything up-to-date

Esostack
źródło
0

Pracowałem z Jupyter-Notebook, gdy napotkałem ten zwodniczy błąd.

Nie byłem w stanie rozwiązać za pomocą powyższych rozwiązań, ponieważ nie miałem odłączonej głowy ani nie miałem różnych nazw dla mojego lokalnego i zdalnego repozytorium.

Ale moje pliki były nieco większe niż 1 MB, a największe były prawie ~ 2 MB . Zmniejszyłem rozmiar pliku za pomocą Jak zmniejszyć rozmiar pliku mojego iPython notebooka?technika. Pomogło zmniejszyć rozmiar mojego pliku, usuwając dane wyjściowe. Byłem w stanie wypchnąć kod, ponieważ odtąd zwiększył mój rozmiar pliku w KB.

rohetoric
źródło