Błąd: nie można pobrać za pomocą rebase: masz zmiany niestacjonarne


149

Zacząłem współpracować z kilkoma przyjaciółmi nad projektem i używają repozytorium git heroku.

Sklonowałem repozytorium kilka dni temu i od tego czasu wprowadzili pewne zmiany, więc próbuję uzyskać najnowsze aktualizacje

Uruchomiłem git pull --rebasepolecenie zgodnie z opisem tutaj (Czy to właściwy sposób?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Otrzymuję następujący błąd:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Domyślam się, że majstrowałem przy kodzie i teraz chce, żebym albo zatwierdził, albo odrzucił (czy to oznacza stash?) Zmiany. Czy to się właśnie dzieje? Jeśli tak jest, chciałbym odrzucić wszelkie zmiany, które mogłem wprowadzić i po prostu pobrać zaktualizowany kod z repozytorium git.

Masz pojęcie, co mogę zrobić?

Odpowiedzi:


182

Zrób git status, to pokaże ci, jakie pliki się zmieniły. Ponieważ powiedziałeś, że nie chcesz zachować zmian, które możesz wprowadzić, git checkout -- <file name>ani git reset --hardsię ich pozbyć.

W większości przypadków git powie Ci, co zrobić ze zmianami. Na przykład komunikat o błędzie mówiący o git stashzmianach. Byłoby tak, gdybyś chciał je zatrzymać. Po ściągnięciu zrobisz to, git stash popa zmiany zostaną ponownie zastosowane.

git status posiada również sposób pozbycia się zmian w zależności od tego, czy plik jest przygotowywany do zatwierdzenia, czy nie.


1
Wydawało się, że to zadziałało, ale teraz mam inny błąd (zacząłem nowe pytania, aby nie mylić przyszłych odwiedzających): stackoverflow.com/questions/23518247/ ...
user3597950

Mam to dosłownie za każdym razem, niedawno. Wcześniej pobieranie plików, które nie mają wpływu na bieżące zmiany, jest w porządku, ale teraz wymaga wszystkiego, co zmienisz, do przechowywania. Nie mogę nawet pchać, jestem zmuszony użyćgit push -f
Karma Blackshaw

@KarmaBlackshaw Nie powinieneś zmuszać do pchania. Jeśli musisz użyć siły, oznacza to, że twoja lokalna historia i zdalna historia są różne i to jest inne pytanie niż to, co obejmuje ta odpowiedź.
Schleis

Rzeczywiście jest inaczej, niż przewiduje zakres tego pytania. Ale znalazłem sposób, usuwając bieżącą gałąź i tworząc nową gałąź z develop. Myślę, że to moja gałąź miała błędnie skonfigurowane pewne rzeczy.
Karma Blackshaw

96

Jeśli chcesz zachować zmiany robocze podczas wykonywania ponownego bazowania, możesz użyć --autostash. Z dokumentacji :

Przed rozpoczęciem rebase schowaj lokalne modyfikacje (zobacz git-stash [1] ), jeśli to konieczne, i zastosuj skrytkę po zakończeniu.

Na przykład:

git pull --rebase --autostash

7
To jest nowoczesna odpowiedź.
adl

14
Jeśli chcesz, aby autostash był domyślnym zachowaniem, możesz ustawić. git config --global rebase.autoStash true Nie musisz przechodzić przełącznika.
Zoredache,

1
TO, czego szukałem! (zwróć uwagę, że przełącznik wiersza poleceń jest dostępny od wersji 2.9, ale opcja rebase.autostashjest dostępna od wersji 2.6).
jjmontes

To też działa świetnie git rebase --interactive!
Dan Dascalescu

6
Dlaczego nie jest to ustawienie domyślne?
Nick

49

Przeciąganie z rebase jest ogólnie dobrą praktyką.

Jednak nie możesz tego zrobić, jeśli twój indeks nie jest czysty, tj. Wprowadziłeś zmiany, które nie zostały zatwierdzone.

Możesz to zrobić, aby obejść ten problem, zakładając, że chcesz zachować zmiany:

  1. przechowuj zmiany w: git stash
  2. wyciągnij od mistrza z rebase
  3. zastosuj ponownie zmiany, które zachowałeś w (1) za pomocą: git stash apply stash@{0}lub prostszejgit stash pop

1
Wydawało się, że to zadziałało, ale teraz mam inny błąd (zacząłem nowe pytania, aby nie mylić przyszłych odwiedzających): stackoverflow.com/questions/23518247/ ...
user3597950

6
@nehemiahjacob Możesz także git stash popzastosować ostatnio zapisane zmiany i uniknąć zapamiętywania dłuższych apply stash@{0}.
Kostas Rousis

Muszę to robić cały czas. Czy jest jakiś łatwiejszy sposób?
Alper

@alper zazwyczaj pracujesz na innej gałęzi (funkcji). Z mojego doświadczenia wynika, że ​​pobieram i ponownie bazuję na master dopiero po tym, jak wykonam swoją pracę, więc nie ma potrzeby ukrywania / popu. Jeśli okaże się, że robisz to często podczas pracy nad rozwojem, zawsze możesz utworzyć alias w swoim .bashrc(lub jakimkolwiek innym miejscu ):alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis

@KostasRousis Mam dokładnie ten alias, lol. Nazywam to „sppgit”
luizfls


16

To działa dla mnie:

git fetch
git rebase --autostash FETCH_HEAD

1
Ach, autostash, to oszczędza mi dodatkowe dwa polecenia. To powinna być poprawna odpowiedź IMO.
Erik Berkun-Drevnig

Możesz również ustawić go jako domyślny w globalnej konfiguracji git, patrz tutaj
agirault

10

Zawsze możesz to zrobić

git fetch && git merge --ff-only origin/master

i albo (a) nie dostaniesz żadnych zmian, jeśli masz niezatwierdzone zmiany, które kolidują z wcześniejszymi zmianami lub (b) ten sam efekt, co stash / pull / apply: rebase, aby wprowadzić najnowsze zmiany z HEAD i pozostały niezatwierdzone jak jest.


6

Kiedy zmiana niestopowa jest spowodowana tym, że git próbuje naprawić konwencje eol w pliku (jak zawsze w moim przypadku), żadna ilość ukrywania, wyewidencjonowywania lub resetowania nie sprawi, że zniknie.

Jednakże, jeśli zamiarem jest naprawdę do rebase i ignorować Unstaged zmieniło, to co mogę zrobić, to usunąć gałąź lokalnie następnie sprawdź to ponownie.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Voila! Jeszcze mnie to nie zawiodło.


4

Jeśli chcesz automatycznie przechowywać swoje zmiany i usuwać je przy każdej ponownej bazie, możesz to zrobić:

git config --global rebase.autoStash true

1
To jedyna odpowiedź, która sprawia, że ​​najnowsza wersja Gita działa tak samo, jak Git zawsze działał w przeszłości. Po co zmuszać ludzi do dodawania, --autostashskoro może to być po prostu ... automatyczne?
Andrew Koster

0

Wykonaj poniższe kroki

Z elementu / gałęzi (wprowadź poniższe polecenie)

git checkout master

git pull

funkcja git checkout / nazwa gałęzi

git merge master

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.