Dlaczego skrytka git nie jest unikalna dla każdej gałęzi?

81

Przypuszczam, że pozwala na przenoszenie zmian z jednej gałęzi do drugiej, ale po to jest właśnie wybieranie wiśni i jeśli nie zatwierdzasz swoich zmian, być może nie powinieneś ich przenosić?

Czasami zakładałem niewłaściwą skrytkę w niewłaściwym oddziale, co powodowało, że zastanawiałem się nad tym pytaniem.

iros
źródło
13
Gitowi brakuje czegoś, co pozwala skojarzyć niezatwierdzone zmiany z gałęzią (lub nagłówkiem). Staje się to widoczne, gdy w danym momencie trwają prace dla więcej niż jednej gałęzi. Jak wskazują tutaj odpowiedzi, stash ma jednak przydatne aplikacje w oparciu o jego cechy. git stash-herektoś?
Blake Taylor

Odpowiedzi:

69

Jak wspomniano, jeśli chcesz mieć „skrzynię na gałąź”, naprawdę chcesz, aby nowa gałąź wypadła z istniejącej gałęzi.

Poza tym, poza wspomnianym już faktem, że skrytka pozwala ci wciągnąć się do gałęzi, nad którą pracujesz, pozwala też na zmianę gałęzi, zanim zrobisz wszystko. Jest to przydatne nie do zbierania wiśni w zwykłym sensie, ale do wybierania wiśniowej kopii roboczej .

F.ex., pracując nad gałęzią funkcji, często zauważam drobne błędy lub kosmetyczne zanieczyszczenia w kodzie, które nie dotyczą tej gałęzi. Cóż, naprawię je od razu. Kiedy nadchodzi czas na zatwierdzenie, wybiórczo zatwierdzam odpowiednie zmiany, ale nie wprowadzam poprawek i kosmetyków. Zamiast tego przechowuję te, co pozwala mi przejść do gałęzi drobnych poprawek w stabilnej, w której mogę następnie zastosować skrytkę i zatwierdzić każdą drobną poprawkę osobno. (W zależności od zmian w pytaniu, będę również schować niektóre z nich jeszcze raz, aby przełączyć się do innego oddziału fabularnym, gdzie zastosowanie tych ).

To pozwala mi wejść głęboko w tryb programowania, kiedy pracuję, i nie martwić się o właściwą bibliotekę mojego kodu. Potem, kiedy robię sobie przerwę psychiczną, mogę wrócić i ostrożnie posortować zmiany na wszystkich odpowiednich półkach.

Gdyby magazyn nie był globalny, tego typu przepływ pracy byłby znacznie trudniejszy do wykonania.

Arystoteles Pagaltzis
źródło
4
Nie zgadzam się z tym: As mentioned, if you want a “per-branch stash,” you really want a new branch forking off from the existing branch.. W szczególności często przełączam się między dwiema wersjami tego samego programu, a uruchomienie pełnej maketrwa 10 minut; możliwość przechowywania zbudowanych plików binarnych dla poszczególnych gałęzi byłaby bardzo miła. I na pewno nie chcę plików binarnych w dzienniku lub w gałęzi.
Clément
Czemu? (Myślę, że wiesz, po prostu tego nie wiesz.)
Arystoteles Pagaltzis
21

Począwszy od Git 1.6, możesz teraz nakładać skrytki na gałęzie za pomocą

git stash branch name_of_new_branch

Git utworzy dla Ciebie nową gałąź i sprawdź to! Więcej informacji znajdziesz w

Domyślam się, że możesz przenosić skrytki za pomocą

git stash branch <branch | new_branch> [<stash>]

a żeby zobaczyć listę swoich skrytek, użyj

git stash list

Odniesienie

iGbanam
źródło
Dziękuję Ci! Nie wiedziałem, że możesz założyć skrytkę na gałęzie, ale wydaje się, że tak właśnie jest. Mając zapas na jednej gałęzi, sprawdziłem inny oddział i wykonałem tam trochę pracy. Jak się okazało, musiałem ukryć niektóre z oczekujących zmian, zanim mogłem zmienić bazę na master. Mój zaktualizowany „ gitk --all” nie pokazywał już mojej pierwszej skrytki; Myślałem, że to może być zbite. Po zakończeniu pracy w drugim oddziale wyrzuciłem ten schowek. Potem mój zaktualizowany plik „ gitk --all” ponownie pokazał oryginalny schowek.
Daniel Miladinov,
17

jeśli chcesz „skrytkę”, która wychodzi poza gałąź, zrób coś takiego, aby zapisać zmiany w nowej gałęzi poza bieżącą gałęzią.

git checkout -b new_stash
git commit -a -m "stashed changes"

żeby cofnąć skrytkę

git reset HEAD^
git branch -d new_stash

git stash jest szczególnie przydatny, ponieważ możesz przeciągać zmiany do brudnego drzewa, tj. jeśli masz zaległe edycje i chcesz zrobić

git pull

a nie możesz, możesz schować zmiany, pociągnąć, a następnie zastosować skrytkę

git stash
git pull
git stash apply
git stash clear

mam nadzieję, że to pomogło!

Patrick_O
źródło
A co, jeśli rzeczy, które próbujesz przechowywać, to na przykład zbiór plików binarnych, które powstały w wyniku uruchomienia makew tej gałęzi? (Magazyn dla poszczególnych gałęzi zaoszczędziłby czas następnym razem, gdy wykonasz kompilację przyrostową w tej gałęzi, ale z pewnością nie chcesz dodawać plików binarnych do indeksu)
Clément
5

git-stash jest dla mnie najbardziej przydatny do przenoszenia niezarejestrowanych zmian do innej gałęzi niż ta, która jest obecnie wyewidencjonowana.

Na przykład - często robię proste zmiany w gałęzi z poprawkami błędów; tylko po to, aby odkryć, że zmiana, nad którą pracuję, jest bardziej złożona, niż przypuszczałem na początku. Git-stash to najłatwiejszy sposób na przeniesienie tego zestawu zmian do innej gałęzi.


źródło