W porządku, powiedzmy, że pewnego dnia dokonamy kilku modyfikacji, a kiedy je wprowadzimy, zauważymy, że pracowaliśmy nad niewłaściwą gałęzią.
Jak możemy zmusić git do zmiany gałęzi bez odrzucania lokalnych zmian .
Prawdopodobnie zamierzam to zrobić naiwnie, czekając na odpowiedź, ale chciałbym wiedzieć, czy istnieje poprawna procedura, ponieważ skłamałbym, gdybym powiedział, że wcześniej mi się to nie przytrafiło ...
- Kopia zapasowa zmieniła repozytorium
git reset --hard
git checkout right-branch
- Przywróć zmiany
git commit -m "changes"
git
git-branch
megawac
źródło
źródło
git stash
git-scm.com/book/en/Git-Tools-StashingOdpowiedzi:
Istnieje wiele różnych sposobów, w zależności od tego, jak daleko jesteś i w której gałęzi (ach) chcesz je mieć.
Zróbmy klasyczny błąd:
Więc teraz chcesz, aby te zmiany, do których jeszcze się nie zobowiązałeś
master
, były obecnedevelop
.Jeśli nie masz
develop
jeszcze metoda jest trywialne:Tworzy to nową
develop
gałąź, zaczynając od tego, gdzie teraz jesteś. Teraz możesz zatwierdzić i wszystko jest gotowedevelop
.Ci mają
develop
. Sprawdź, czy Git pozwoli ci się przełączyć bez robienia czegokolwiek:To się powiedzie lub będzie narzekać. Jeśli to się uda, świetnie! Po prostu się zaangażuj. Jeśli nie (
error: Your local changes to the following files would be overwritten ...
), nadal masz wiele opcji.Prawdopodobnie najłatwiej jest
git stash
(jak powiedzieli wszyscy inni respondenci, którzy pokonali mnie w kliknięciu post). Rungit stash save
lubgit stash push
, 1 lub po prostugit stash
co jest skrótemsave
/push
:To zatwierdza twój kod (tak, naprawdę robi pewne zatwierdzenia) przy użyciu dziwnej metody nie-rozgałęzienia-y. Wprowadzane przez niego zatwierdzenia nie znajdują się „w” żadnej gałęzi, ale są teraz bezpiecznie przechowywane w repozytorium, więc możesz teraz przełączać gałęzie, a następnie „stosować” skrytkę:
Jeśli wszystko pójdzie dobrze i podoba ci się wyniki, powinieneś to zrobić
git stash drop
. To usuwa odniesienie do dziwnych zatwierdzeń typu non-branch-y. (Nadal znajdują się w repozytorium i czasami można je odzyskać w nagłych wypadkach, ale w większości celów należy uznać, że w tym momencie zniknęły).Ten
apply
krok łączy ukryte zmiany, korzystając z potężnego mechanizmu scalającego Git, tego samego rodzaju, którego używa podczas scalania gałęzi. Oznacza to, że możesz uzyskać „konflikty podczas łączenia”, jeśli gałąź, nad którą pracowałeś przez pomyłkę, wystarczająco różni się od gałęzi, nad którą zamierzałeś pracować. Dlatego dobrym pomysłem jest dokładne sprawdzenie wyników, zanim założysz, że skrytka została zastosowana prawidłowo, nawet jeśli sam Git nie wykrył żadnych konfliktów scalania.Wiele osób używa
git stash pop
, co jest krótką ręką dlagit stash apply && git stash drop
. O ile to możliwe, to w porządku, ale oznacza to, że jeśli aplikacja spowoduje bałagan i zdecydujesz, że nie chcesz iść tą ścieżką, nie możesz łatwo odzyskać skrytki. Dlatego polecam oddzielićapply
, sprawdzić wyniki,drop
tylko wtedy, gdy są satysfakcjonujące. (To oczywiście wprowadza kolejny punkt, w którym możesz zrobić kolejną przerwę na kawę i zapomnieć o tym, co robiłeś, wrócić i zrobić coś złego , więc nie jest to doskonałe lekarstwo).1
save
wgit stash save
to stary czasownik tworzenia nowego zapas. Git w wersji 2.13 wprowadził nowy czasownik, aby uczynić rzeczy bardziej spójnymipop
i dodać więcej opcji do polecenia tworzenia. Git w wersji 2.16 formalnie zdezaktualizował stary czasownik (chociaż nadal działa w Git 2.23, który jest najnowszą wersją w czasie, gdy go edytuję).źródło
git stash
tak, że zatwierdzenia - ponieważgit stash
dostajesz dwa zatwierdzenia na wpis w skrytce, w nietypowym układzie - nie znajdują się na żadnej gałęzi. Z wyjątkiem bardzo krótkoterminowych, specjalnych przypadków, generalnie wolę wykonywać zwykłe zatwierdzenie. Możeszgit reset --soft
lubgit reset --mixed
później, lub użyj,git commit --amend
aby odłożyć go na bok, kiedy wrócisz do pracy nad tą gałęzią. (W nowoczesnym Gicie można też użyćgit worktree add
, co może być jeszcze lepszym rozwiązaniem.)Użyj git stash
Wprowadza zmiany do stosu. Jeśli chcesz je cofnąć, użyj
Możesz nawet wyciągać pojedyncze elementy. Aby całkowicie zdmuchnąć skrytkę:
źródło
git stash drop
;git stash clear
usunie cały stos skrytek, w tym prawdopodobnie niepowiązane z tym zestawem poleceń.git stash
aby zapisać niezatwierdzone zmianygit stash list
aby wyświetlić listę zapisanych niezaangażowanych skrytekgit stash apply stash@{x}
gdzie x może być 0,1,2..nie utworzonych skrytekźródło
Możesz albo :
Służy
git stash
do odkładania zmian na półkę lubUtwórz inną gałąź i zatwierdź tam swoje zmiany, a następnie scal tę gałąź z katalogiem roboczym
źródło